在Linux系统中,线程同步方法是实现多线程协同工作的关键。这篇文章将详细介绍Linux下的线程同步方法,包括信号量、互斥锁、条件变量等。
1.信号量
信号量是一种用于多进程或多线程之间同步与互斥的机制。它可以控制某个共享资源的访问数量,从而避免竞态条件(racecondition)。
在Linux中,可以使用sem_init()函数初始化一个信号量,使用sem_wait()函数等待信号量值变为非零,使用sem_post()函数增加信号量值。下面是一个简单的示例:
c
#include
#include
#include
#include
#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 int*id=malloc(sizeof(int)); *id=i; pthread_create(&threads[i],NULL,thread_func,id); } for(i=0;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 #include #include #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 int*id=malloc(sizeof(int)); *id=i; pthread_create(&threads[i],NULL,thread_func,id); } for(i=0;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 #include #include #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 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 pthread_join(threads[i],NULL); } pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); return0; } 上面的代码创建了10个线程,它们会等待一个条件变量。主线程在所有线程都准备就绪后,发送了一个条件变量,所有等待该条件变量的线程都被唤醒并继续执行。 总结 本文介绍了Linux下的三种线程同步方法:信号量、互斥锁、条件变量。这些方法可以帮助我们实现多线程协同工作,避免竞态条件,提高程序的并发性能。 whatsapp官网版下载:https://cjge-manuscriptcentral.com/software/3773.html
上一篇:linux删除畸形文件
下一篇:linux删除六级以下目录