Linux下实现线程同步互斥的方法 (linux 线程同步互斥)
在多线程编程中,线程之间的同步和互斥是非常重要的话题,特别是在多个线程需要同时访问共享资源的情况下,同步和互斥更是不可或缺的。在Linux系统下,有多种方法可以实现线程的同步和互斥,下面将介绍几种较为常见的方法。
一、互斥锁
互斥锁也称为互斥量,是一种用于保护共享资源的锁。它可以通过对于需要访问共享资源的线程进行加锁和解锁的操作来保证共享资源的互斥性。在Linux系统下,可以使用pthread_mutex_t来定义互斥锁。下面是一个简单的互斥锁的使用示例:
“`c
#include
#include
pthread_mutex_t mutex;
int shared_data = 0;
void *worker(void *arg) {
pthread_mutex_lock(&mutex);
shared_data += 1;
printf(“Update shared data to %d\n”, shared_data);
pthread_mutex_unlock(&mutex);
return NULL;
}
int mn(int argc, char *argv[]) {
pthread_t t1, t2;
pthread_mutex_init(&mutex, NULL);
pthread_create(&t1, NULL, worker, NULL);
pthread_create(&t2, NULL, worker, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
“`
在上面的示例中,定义了一个全局变量shared_data和一个互斥锁mutex。在worker函数中,首先调用`pthread_mutex_lock`来申请互斥锁,然后对共享资源shared_data进行更新,最后调用`pthread_mutex_unlock`来释放互斥锁。在mn函数中,创建了两个线程分别执行worker函数,并且在最后调用了`pthread_mutex_destroy`来销毁互斥锁。
二、条件变量
条件变量是一种能够支持在共享资源满足某种特定条件时,让线程在等待状态下暂停自己运行的机制。在Linux系统下,可以使用`pthread_cond_t`来定义条件变量,以及相关的`pthread_cond_wt`和`pthread_cond_signal`等函数来实现条件变量的使用。下面是一个简单示例:
“`c
#include
#include
#include
pthread_cond_t cond;
pthread_mutex_t mutex;
int shared_data = 0;
void *worker_producer(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
shared_data += 1;
printf(“Produce %d\n”, shared_data);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
void *worker_consumer(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (shared_data == 0) {
pthread_cond_wt(&cond, &mutex);
}
shared_data -= 1;
printf(“Consume %d\n”, shared_data);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
int mn(int argc, char *argv[]) {
pthread_t t_producer, t_consumer;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
pthread_create(&t_producer, NULL, worker_producer, NULL);
pthread_create(&t_consumer, NULL, worker_consumer, NULL);
pthread_join(t_producer, NULL);
pthread_join(t_consumer, NULL);
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);
return 0;
}
“`
在上面的示例中,定义了一个全局变量shared_data和一个互斥锁mutex,并且定义了一个条件变量cond。在worker_producer函数中,不断地对共享资源shared_data进行更新,并且通过`pthread_cond_signal`来通知worker_consumer线程去执行,并且最后调用`pthread_mutex_unlock`来释放互斥锁。在worker_consumer函数中,首先调用`pthread_mutex_lock`来申请互斥锁,然后通过while循环来判断共享资源是否满足条件,如果满足条件,则执行相关的操作,如果不满足条件,则调用`pthread_cond_wt`来暂停自己的运行,并且等待worker_producer线程来唤醒它。在mn函数中创建了两个线程分别执行worker_producer函数和worker_consumer函数,并且在结束时进行一些资源的销毁和清理工作。