首页 > 其他分享 >tqt507 pthread 多线程测试 atomic 原子操作

tqt507 pthread 多线程测试 atomic 原子操作

时间:2023-06-27 11:34:44浏览次数:40  
标签:count val read pthread tqt507 atomic printf 多线程

//

// tqt057 测试结果  find /opt -name *atomic.h*
// aarch64-linux-gnu-gcc demoatomic.c -o demoatomic -pthread -I/opt/EmbedSky/TQT507/CoreA/longan/kernel/linux-4.9/tools/include
// cp ./demoatomic /home/book/nfs_rootfs

#include <linux/atomic.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>

/* 定义一个原子变量 */
static atomic_t count = ATOMIC_INIT(0);

#define pthidall 20

pthread_t pthid[pthidall];
int count_total=20000;
static void *pthread_test(void *arg)
{
    for (int i = 0; i < count_total; i++) { 
        atomic_inc(&count);
    }
}

/* 在函数中使用原子操作 */
int main(void) {
    int val = 0;
    
    for (int i = 0; i < pthidall; i++) { 
        pthread_create(&pthid[i],NULL,pthread_test, NULL);
    }
    for (int i = 0; i < pthidall; i++) { 
        if ( pthread_join ( pthid[i], NULL ) ) {
            printf("error join thread->%d \n",pthid[i]);
        }
     }
    

    /* 原子自增 */
    //atomic_inc(&count);
    //atomic_set(atomic_t * v, int i);

    /* 读取原子变量值 */
    val = atomic_read(&count);
    printf("pthread test atomic_inc->%d\n",val);//pthidall*count_total
    
    /* 设置原子变量值 */ 
    atomic_set(&count, 5);
    val = atomic_read(&count); printf("atomic_set->%d\n",val);
    
     
    //生下的几个报错没有此函数
    /* 原子比较并交换:如果原子变量值为 5,则将其设置为 7。 */
    //val = atomic_read(&count); printf("atomic_read->%d\n",val);
    //atomic_cmpxchg(&count, 5, 7);
    //val = atomic_read(&count); printf("atomic_cmpxchg 5->7 ->%d\n",val);
    //val = atomic_read(&count); printf("atomic_read->%d\n",val);
    //atomic_cmpxchg(&count, 0, 1);
    //val = atomic_read(&count); printf("atomic_cmpxchg 0->1 ->%d\n",val);

    /* 原子自减 */
    //val = atomic_read(&count); printf("atomic_read->%d\n",val);
    //atomic_dec(&count);
    //val = atomic_read(&count); printf("atomic_dec->%d\n",val);

    /* 原子加操作 */
    //val = atomic_read(&count); printf("atomic_read->%d\n",val);
    //atomic_add(2, &count);
    //val = atomic_read(&count); printf("atomic_add->%d\n",val);

    /* 原子减操作 */
    //val = atomic_read(&count); printf("atomic_read->%d\n",val);
    //atomic_sub(1, &count);
    //val = atomic_read(&count); printf("atomic_sub->%d\n",val);

    return 0;
}

 

//

标签:count,val,read,pthread,tqt507,atomic,printf,多线程
From: https://www.cnblogs.com/RYSBlog/p/17508236.html

相关文章

  • 多进程和多线程以及协程的创建模板
    【一】开启多进程的创建模板(基于Process模块)【1】方式一:创建多进程importmultiprocessingdefworker(n):"""子进程要执行的任务"""print(f'子进程{n}正在执行')defmain():task_lists=[]foriinrange(100)#创建一个进程对象......
  • Linux多线程09-互斥锁
    为避免线程更新共享变量时出现问题,可以使用互斥量(mutex是mutualexclusion的缩写)来确保同时仅有一个线程可以访问某项共享资源。可以使用互斥量来保证对任意共享资源的原子访问。互斥量有两种状态:已锁定(locked)和未锁定(unlocked)。任何时候,至多只有一个线程可以锁定该互斥量。试......
  • Linux多线程10-死锁
    有时,一个线程需要同时访问两个或更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,就有可能发生死锁。两个或两个以上的进程在执行过程中,因争夺共享资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状......
  • Linux多线程12-生产者和消费者模型
    一个最简单的生产者消费者模型/*生产者消费者模型(粗略版)*/#include<stdio.h>#include<pthread.h>#include<stdlib.h>#include<unistd.h>structNode{intnum;structNode*next;};//头节点structNode*head=NULL;void*producer(void*arg){......
  • Linux多线程11-读写锁
    当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住。但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互斥锁的排它性,所有其它线程都无法获取锁,也就无法读访问共享资源了,但是实际上多个线程同时......
  • Linux多线程14-信号量
    信号量的类型sem_tintsem_init(sem_t*sem,intpshared,unsignedintvalue);初始化信号量参数:-sem:信号量变量地址-pshared:0用在线程间,非0用在进程间-value:信号量中的值intsem_destroy(sem_t*sem);释放资......
  • Linux多线程13-条件变量
    上节代码存在的问题:生产者已经没有数据了,消费者还在while循环判断是否有数据,浪费资源没有数据了应该通知生产者生产,生产好了通知消费者消费这就需要条件变量pthread_cond_tintpthread_cond_init(pthread_cond_t*restrictcond,constpthread_con......
  • Linux多线程01-线程概述
    线程概述与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(传统意义上的UNIX进程只是多线程程序......
  • Linux多线程02-创建线程
    pthread_create描述:pthread_create()函数在调用进程中创建一个新的线程。新线程通过调用start_routine()开始执行,arg作为start_routine()的唯一参数传递。新线程以以下方式之一终止:调用pthread_exit(3),指定可供调用同一进程中pthread_join(3)的其他线程使用的退......
  • Linux多线程04-连接已终止的线程
    pthread_join描述:pthread_join()函数等待由thread指定的线程终止。如果该线程已经终止,则pthread_join()将立即返回。由thread指定的线程必须是可连接的。如果retval不为NULL,则pthread_join()将目标线程的退出状态(即目标线程提供给pthread_exit(3)的值)复制到retval指向的......