时间: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中线程同步的基本原理,包括互斥锁、条件变量、信号量等。在实际编程中,需要根据具体业务场景选择合适的线程同步机制,以保证程序的正确性和效率。
imtoken钱包:https://cjge-manuscriptcentral.com/software/2030.html