在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
,并使用条件变量实现生产者和消费者之间的同步,当生产者生成数据后,它会唤醒等待条件变量的消费者线程;当消费者消费数据时,它会等待条件变量,直到生产者线程生成新的数据。
最新评论
本站CDN与莫名CDN同款、亚太CDN、速度还不错,值得推荐。
感谢推荐我们公司产品、有什么活动会第一时间公布!
我在用这类站群服务器、还可以. 用很多年了。