linux互斥锁和信号量

在Linux编程中,互斥锁(Mutex)条件变量(Condition Variable)是用于同步线程的两种基本机制,互斥锁用于保护共享资源,避免多个线程同时访问;条件变量则用于线程间的通信,允许一个或多个线程等待某个特定条件的发生。

linux互斥锁和信号量
(图片来源网络,侵删)

以下是互斥锁和条件变量的操作步骤:

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

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
酷盾叔订阅
上一篇 2024-03-04 10:22
下一篇 2024-03-04 10:25

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入