时间: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下的三种线程同步方法:信号量、互斥锁、条件变量。这些方法可以帮助我们实现多线程协同工作,避免竞态条件,提高程序的并发性能。
whatsapp官网版下载:https://cjge-manuscriptcentral.com/software/3773.html