在Linux编程中,互斥锁(Mutex)和条件变量(Condition Variable)是用于同步线程的两种基本机制,互斥锁用于保护共享资源,避免多个线程同时访问;条件变量则用于线程间的通信,允许一个或多个线程等待某个特定条件的发生。
以下是互斥锁和条件变量的操作步骤:
1、定义和初始化互斥锁和条件变量:
#include <pthread.h> pthread_mutex_t mutex; // 定义互斥锁 pthread_cond_t cond; // 定义条件变量 int main() { pthread_mutex_init(&mutex, NULL); // 初始化互斥锁 pthread_cond_init(&cond, NULL); // 初始化条件变量 ... }
2、使用互斥锁保护共享资源:
pthread_mutex_lock(&mutex); // 加锁 // 访问共享资源 pthread_mutex_unlock(&mutex); // 解锁
3、使用条件变量等待和通知:
pthread_cond_wait(&cond, &mutex); // 等待条件变量,同时释放互斥锁 ... // 修改共享资源,满足条件后 pthread_cond_signal(&cond); // 唤醒等待条件变量的一个线程 pthread_cond_broadcast(&cond); // 唤醒所有等待条件变量的线程
4、销毁互斥锁和条件变量:
pthread_mutex_destroy(&mutex); // 销毁互斥锁 pthread_cond_destroy(&cond); // 销毁条件变量
下面是一个使用互斥锁和条件变量的简单示例:
#include <stdio.h> #include <pthread.h> pthread_mutex_t mutex; pthread_cond_t cond; int data = 0; void *producer(void *arg) { for (int i = 0; i < 10; ++i) { pthread_mutex_lock(&mutex); data = i; printf("Producer: data = %d ", data); pthread_cond_signal(&cond); // 唤醒消费者线程 pthread_mutex_unlock(&mutex); } return NULL; } void *consumer(void *arg) { for (int i = 0; i < 10; ++i) { pthread_mutex_lock(&mutex); while (data == 0) { pthread_cond_wait(&cond, &mutex); // 等待生产者线程 } printf("Consumer: data = %d ", data); data = 0; pthread_mutex_unlock(&mutex); } return NULL; } int main() { pthread_t producer_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); return 0; }
在这个示例中,我们创建了两个线程:生产者(producer)和消费者(consumer),生产者线程负责生成数据,消费者线程负责消费数据,我们使用互斥锁保护共享变量data
,并使用条件变量实现生产者和消费者之间的同步,当生产者生成数据后,它会唤醒等待条件变量的消费者线程;当消费者消费数据时,它会等待条件变量,直到生产者线程生成新的数据。
原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/306579.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复