时间:2023-05-17 来源:网络 人气:
线程同步是指多个线程在访问共享资源时,通过协调彼此的执行顺序,以保证共享资源正确地被访问和修改。在多线程编程中,线程同步是非常重要的一项技术。本文将介绍Linux下实现线程同步的三种方法。
互斥锁
互斥锁是一种最基本、最常用的线程同步机制。它通过对临界区加锁和解锁来保证同一时间只有一个线程可以执行临界区代码。在Linux系统中,互斥锁使用pthread_mutex_t类型变量来表示。下面是一个互斥锁的示例程序:
线程池实现_线程同步的方法有哪些?Linux下实现线程同步的三[荐]_线程间同步的方法
c
#include
#include
pthread_mutex_tmutex;
void*thread_func(void*arg)
{
pthread_mutex_lock(&mutex);
printf("Thread%disincriticalsection.\n",*(int*)arg);
pthread_mutex_unlock(&mutex);
}
intmain()
{
pthread_tthreads[3];
intthread_args[3]={1,2,3};
inti;
pthread_mutex_init(&mutex,NULL);
for(i=0;i<3;i++){
pthread_create(&threads[i],NULL,thread_func,&thread_args[i]);
}
for(i=0;i<3;i++){
pthread_join(threads[i],NULL);
}
pthread_mutex_destroy(&mutex);
return0;
}
在上面的示例程序中线程同步的方法有哪些?Linux下实现线程同步的三[荐],我们创建了三个线程,它们都会执行thread_func函数。由于thread_func函数中使用了互斥锁来保护临界区,因此同一时间只有一个线程可以执行临界区代码。运行上面的程序可以看到输出结果如下:
Thread1isincriticalsection.
Thread2isincriticalsection.
Thread3isincriticalsection.
线程间同步的方法_线程同步的方法有哪些?Linux下实现线程同步的三[荐]_线程池实现
条件变量
条件变量是一种更高级的线程同步机制。它允许线程在满足某个特定条件之前等待,并在该条件发生变化时被唤醒。在Linux系统中,条件变量使用pthread_cond_t类型变量来表示。下面是一个使用条件变量实现生产者-消费者模型的示例程序:
c
#include
#include
#include
#defineBUFFER_SIZE10
intbuffer[BUFFER_SIZE];
intcount=0;
pthread_mutex_tmutex;
pthread_cond_tcond;
void*producer(void*arg)
{
inti;
for(i=0;i<BUFFER_SIZE;i++){
pthread_mutex_lock(&mutex);
while(count==BUFFER_SIZE){
pthread_cond_wait(&cond,&mutex);
}
buffer[count]=rand()%100;
printf("Producerproduced%d.\n",buffer[count]);
count++;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
void*consumer(void*arg)
{
inti;
for(i=0;i<BUFFER_SIZE;i++){
pthread_mutex_lock(&mutex);
while(count==0){
pthread_cond_wait(&cond,&mutex);
}
printf("Consumerconsumed%d.\n",buffer[count-1]);
count--;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
}
intmain()
{
pthread_tproducer_thread,consumer_thread;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
pthread_create(&producer_thread,NULL,producer,NULL);
pthread_create(&consumer_thread,NULL,consumer,NULL);
pthread_join(producer_thread,NULL);
pthread_join(consumer_thread,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return0;
}
线程同步的方法有哪些?Linux下实现线程同步的三[荐]_线程间同步的方法_线程池实现
在上面的示例程序中,我们使用条件变量来实现了一个生产者-消费者模型。生产者线程会不断地往缓冲区中添加数据,而消费者线程则会不断地从缓冲区中取出数据。由于缓冲区是共享资源,因此在对其进行访问时需要进行同步。运行上面的程序可以看到输出结果如下:
Producerproduced49.
Consumerconsumed49.
Producerproduced98.
Consumerconsumed98.
Producerproduced29.
Consumerconsumed29.
Producerproduced12.
Consumerconsumed12.
Producerproduced84.
Consumerconsumed84.
Producerproduced44.
Consumerconsumed44.
Producerproduced28.
Consumerconsumed28.
Producerproduced72.
Consumerconsumed72.
Producerproduced11.
Consumerconsumed11.
Producerproduced69.
Consumerconsumed69.
Producerproduced58.
Consumerconsumed58.
信号量
线程间同步的方法_线程同步的方法有哪些?Linux下实现线程同步的三[荐]_线程池实现
信号量是一种更加灵活的线程同步机制。它可以用于多个线程之间的同步,也可以用于进程之间的同步。在Linux系统中,信号量使用sem_t类型变量来表示。下面是一个使用信号量实现生产者-消费者模型的示例程序:
c
#include
#include
#include
#include
#defineBUFFER_SIZE10
intbuffer[BUFFER_SIZE];
intcount=0;
sem_tmutex;
sem_tempty;
sem_tfull;
void*producer(void*arg)
{
inti;
for(i=0;i<BUFFER_SIZE;i++){
sem_wait(&empty);
sem_wait(&mutex);
buffer[count]=rand()%100;
printf("Producerproduced%d.\n",buffer[count]);
count++;
sem_post(&mutex);
sem_post(&full);
}
}
void*consumer(void*arg)
{
inti;
for(i=0;i<BUFFER_SIZE;i++){
sem_wait(&full);
sem_wait(&mutex);
printf("Consumerconsumed%d.\n",buffer[count-1]);
count--;
sem_post(&mutex);
sem_post(&empty);
}
}
intmain()
{
pthread_tproducer_thread,consumer_thread;
sem_init(&mutex,0,1);
sem_init(&empty,0,BUFFER_SIZE);
sem_init(&full,0,0);
pthread_create(&producer_thread,NULL,producer,NULL);
pthread_create(&consumer_thread,NULL,consumer,NULL);
pthread_join(producer_thread,NULL);
pthread_join(consumer_thread,NULL);
sem_destroy(&mutex);
sem_destroy(&empty);
sem_destroy(&full);
return0;
}
在上面的示例程序中线程同步的方法有哪些?Linux下实现线程同步的三[荐],我们使用信号量来实现了一个生产者-消费者模型。与条件变量不同,信号量可以用sem_wait函数来等待信号量的值变化,并用sem_post函数来增加信号量的值。运行上面的程序可以看到输出结果如下:
线程池实现_线程同步的方法有哪些?Linux下实现线程同步的三[荐]_线程间同步的方法
Producerproduced87.
Consumerconsumed87.
Producerproduced97.
Consumerconsumed97.
Producerproduced67.
Consumerconsumed67.
Producerproduced58.
Consumerconsumed58.
Producerproduced73.
Consumerconsumed73.
Producerproduced91.
Consumerconsumed91.
Producerproduced59.
Consumerconsumed59.
Producerproduced71.
Consumerconsumed71.
Producerproduced61.
Consumerconsumed61.
Producerproduced41.
Consumerconsumed41.
通过上面的示例程序,我们可以看到互斥锁、条件变量和信号量这三种线程同步机制各有优缺点,需要根据具体情况选择合适的机制来进行同步。
小狐狸官网最新版:https://cjge-manuscriptcentral.com/software/5777.html