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

当前位置: 首页  >  教程资讯 linux下线程同步方法

linux下线程同步方法

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

    在Linux系统中,线程同步方法是实现多线程协同工作的关键。这篇文章将详细介绍Linux下的线程同步方法,包括信号量、互斥锁、条件变量等。

    1.信号量

    信号量是一种用于多进程或多线程之间同步与互斥的机制。它可以控制某个共享资源的访问数量,从而避免竞态条件(racecondition)。

    在Linux中,可以使用sem_init()函数初始化一个信号量,使用sem_wait()函数等待信号量值变为非零,使用sem_post()函数增加信号量值。下面是一个简单的示例:

    c

    #include<stdio.h>

    #include<stdlib.h>

    #include<pthread.h>

    #include<semaphore.h>

    #defineTHREAD_NUM10

    sem_tsem;

    void*thread_func(void*arg)

    {

    intid=*(int*)arg;

    printf("Thread%diswaitingforthesemaphore...\n",id);

    sem_wait(&sem);

    printf("Thread%dacquiredthesemaphore!\n",id);

    sleep(1);

    printf("Thread%dreleasedthesemaphore.\n",id);

    sem_post(&sem);

    }

    intmain()

    {

    pthread_tthreads[THREAD_NUM];

    sem_init(&sem,0,5);

    inti;

    for(i=0;i<THREAD_NUM;i++){

    int*id=malloc(sizeof(int));

    *id=i;

    pthread_create(&threads[i],NULL,thread_func,id);

    }

    for(i=0;i<THREAD_NUM;i++){

    pthread_join(threads[i],NULL);

    }

    sem_destroy(&sem);

    return0;

    }

    上面的代码创建了10个线程,它们会竞争一个初始值为5的信号量。每个线程在执行前都会等待信号量,如果信号量值为0,则会阻塞等待;否则会减少信号量值并继续执行。当线程执行完毕后,会释放信号量。

    2.互斥锁

    互斥锁是一种用于保护共享资源的机制。它可以防止多个线程同时访问某个共享资源,从而避免竞态条件。

    在Linux中,可以使用pthread_mutex_init()函数初始化一个互斥锁,使用pthread_mutex_lock()函数获取互斥锁,使用pthread_mutex_unlock()函数释放互斥锁。下面是一个简单的示例:

    c

    #include<stdio.h>

    #include<stdlib.h>

    #include<pthread.h>

    #defineTHREAD_NUM10

    pthread_mutex_tmutex;

    void*thread_func(void*arg)

    {

    intid=*(int*)arg;

    printf("Thread%distryingtoacquirethemutex...\n",id);

    pthread_mutex_lock(&mutex);

    printf("Thread%dacquiredthemutex!\n",id);

    sleep(1);

    printf("Thread%dreleasedthemutex.\n",id);

    pthread_mutex_unlock(&mutex);

    }

    intmain()

    {

    pthread_tthreads[THREAD_NUM];

    pthread_mutex_init(&mutex,NULL);

    inti;

    for(i=0;i<THREAD_NUM;i++){

    int*id=malloc(sizeof(int));

    *id=i;

    pthread_create(&threads[i],NULL,thread_func,id);

    }

    for(i=0;i<THREAD_NUM;i++){

    pthread_join(threads[i],NULL);

    }

    pthread_mutex_destroy(&mutex);

    return0;

    }

    上面的代码创建了10个线程,它们会竞争一个互斥锁。每个线程在执行前都会获取互斥锁,如果互斥锁已经被其他线程占用,则会阻塞等待;否则会占用互斥锁并继续执行。当线程执行完毕后,会释放互斥锁。

    3.条件变量

    条件变量是一种用于多线程之间通信的机制。它可以使一个线程等待另一个线程发出的信号,并在信号到达时被唤醒。

    在Linux中,可以使用pthread_cond_init()函数初始化一个条件变量,使用pthread_cond_wait()函数等待条件变量,使用pthread_cond_signal()或pthread_cond_broadcast()函数发送条件变量。下面是一个简单的示例:

    c

    #include<stdio.h>

    #include<stdlib.h>

    #include<pthread.h>

    #defineTHREAD_NUM10

    pthread_mutex_tmutex;

    pthread_cond_tcond;

    void*thread_func(void*arg)

    {

    intid=*(int*)arg;

    printf("Thread%diswaitingfortheconditionvariable...\n",id);

    pthread_mutex_lock(&mutex);

    pthread_cond_wait(&cond,&mutex);

    printf("Thread%dreceivedtheconditionvariable!\n",id);

    sleep(1);

    printf("Thread%dreleasedthemutex.\n",id);

    pthread_mutex_unlock(&mutex);

    }

    intmain()

    {

    pthread_tthreads[THREAD_NUM];

    pthread_mutex_init(&mutex,NULL);

    pthread_cond_init(&cond,NULL);

    inti;

    for(i=0;i<THREAD_NUM;i++){

    int*id=malloc(sizeof(int));

    *id=i;

    pthread_create(&threads[i],NULL,thread_func,id);

    }

    sleep(1);//等待所有线程准备就绪

    printf("Sendingtheconditionvariable...\n");

    pthread_cond_broadcast(&cond);

    for(i=0;i<THREAD_NUM;i++){

    pthread_join(threads[i],NULL);

    }

    pthread_mutex_destroy(&mutex);

    pthread_cond_destroy(&cond);

    return0;

    }

    上面的代码创建了10个线程,它们会等待一个条件变量。主线程在所有线程都准备就绪后,发送了一个条件变量,所有等待该条件变量的线程都被唤醒并继续执行。

    总结

    本文介绍了Linux下的三种线程同步方法:信号量、互斥锁、条件变量。这些方法可以帮助我们实现多线程协同工作,避免竞态条件,提高程序的并发性能。

src-TVRZNMTY4NTQzNzkyMAaHR0cHM6Ly9pMC53cC5jb20vdXBsb2FkLWltYWdlcy5qaWFuc2h1LmlvL3VwbG9hZF9pbWFnZXMvMTA1NDA1NjgtMGE0YTg5MWY3MGQ2OTg2Ni5wbmc=.webp.jpg

whatsapp官网版下载:https://cjge-manuscriptcentral.com/software/3773.html

作者 小编

教程资讯

教程资讯排行

系统教程

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