5G系统之家网站 - 操作系统光盘下载网站!

当前位置: 首页  >  教程资讯 linux之线程同步基本原理

linux之线程同步基本原理

时间:2023-05-29 来源:网络 人气:

    在多线程编程中,线程同步是一个非常重要的问题。本文将介绍Linux中线程同步的基本原理,包括互斥锁、条件变量、信号量等。

    互斥锁

    互斥锁是保证共享资源在同一时刻只被一个线程访问的一种机制。当一个线程获得了互斥锁,其他线程就必须等待该线程释放互斥锁后才能访问共享资源。下面是一个简单的互斥锁示例代码:

    #include<pthread.h>

    #include<stdio.h>

    pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;

    intcount=0;

    void*increment(void*arg){

    for(inti=0;i<1000000;i++){

    pthread_mutex_lock(&mutex);

    count++;

    pthread_mutex_unlock(&mutex);

    }

    returnNULL;

    }

    intmain(){

    pthread_tthread1,thread2;

    pthread_create(&thread1,NULL,increment,NULL);

    pthread_create(&thread2,NULL,increment,NULL);

    pthread_join(thread1,NULL);

    pthread_join(thread2,NULL);

    printf("count:%d\n",count);

    return0;

    }

    上面的代码创建了两个线程,它们都会对count变量进行1000000次自增操作。由于count变量是共享资源,因此需要使用互斥锁进行保护。

    条件变量

    条件变量是一种线程同步机制,它允许线程在满足特定条件之前等待。当条件满足时,线程可以被唤醒并继续执行。下面是一个使用条件变量的示例代码:

    #include<pthread.h>

    #include<stdio.h>

    pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;

    pthread_cond_tcond=PTHREAD_COND_INITIALIZER;

    intcount=0;

    void*waiter(void*arg){

    pthread_mutex_lock(&mutex);

    while(count<10){

    pthread_cond_wait(&cond,&mutex);

    }

    printf("waiter:countis%d\n",count);

    pthread_mutex_unlock(&mutex);

    returnNULL;

    }

    void*increment(void*arg){

    for(inti=0;i<1000000;i++){

    pthread_mutex_lock(&mutex);

    count++;

    if(count==10){

    pthread_cond_signal(&cond);

    }

    pthread_mutex_unlock(&mutex);

    }

    returnNULL;

    }

    intmain(){

    pthread_tthread1,thread2;

    pthread_create(&thread1,NULL,increment,NULL);

    pthread_create(&thread2,NULL,waiter,NULL);

    pthread_join(thread1,NULL);

    pthread_join(thread2,NULL);

    return0;

    }

    上面的代码创建了两个线程,一个线程负责自增count变量,另一个线程等待count变量达到10。当count变量达到10时,等待线程被唤醒并打印出count的值。

    信号量

    信号量是一种线程同步机制,它允许多个线程同时访问共享资源,但是同时只有一定数量的线程可以访问。下面是一个使用信号量的示例代码:

    #include<pthread.h>

    #include<semaphore.h>

    #include<stdio.h>

    sem_tsem;

    intcount=0;

    void*increment(void*arg){

    for(inti=0;i<1000000;i++){

    sem_wait(&sem);

    count++;

    sem_post(&sem);

    }

    returnNULL;

    }

    intmain(){

    sem_init(&sem,0,1);

    pthread_tthread1,thread2;

    pthread_create(&thread1,NULL,increment,NULL);

    pthread_create(&thread2,NULL,increment,NULL);

    pthread_join(thread1,NULL);

    pthread_join(thread2,NULL);

    printf("count:%d\n",count);

    sem_destroy(&sem);

    return0;

    }

    上面的代码创建了两个线程,它们都会对count变量进行1000000次自增操作。由于使用了信号量进行保护,因此两个线程可以同时访问count变量,但是同时只有一个线程可以访问。

    总结

    本文介绍了Linux中线程同步的基本原理,包括互斥锁、条件变量、信号量等。在实际编程中,需要根据具体业务场景选择合适的线程同步机制,以保证程序的正确性和效率。

src-TVRZNMTY4NTM0MTY3NQaHR0cHM6Ly93d3cuc3ViaW5nd2VuLmNuL2NwcC9tdXRleC9pbWFnZS0yMDIxMDQxMDEwMDIyNDkxMC5wbmc=.jpg

imtoken钱包:https://cjge-manuscriptcentral.com/software/2030.html

作者 小编

教程资讯

教程资讯排行

系统教程

    标签arclist报错:指定属性 typeid 的栏目ID不存在。