关于互斥量

1.使用条件变量做线程同步的时候,使用while而不是if,是因为可能会出现假唤醒的情况,

while(!flag) {

    cond.wait(lock);

}

2.notify_one会唤醒一个等待该变量的线程,若没有线程等待,则什么也不做,若有多个线程等待,无法确定会唤醒哪一个。

3.关于几种互斥量

mull_mutex

无任何锁定功能的“互斥量”,空对象模式是用。

mutex

独占式互斥量,最简单但最常用

timed_mutex

独占式互斥量,一段时间内试图锁定,若超时则返回false

recursive_mutex

递归式互斥量,可以多次锁定,相应的也要多次解锁

Recursive_timed_mutex

递归式互斥量,同样增加一段时间内试图锁定,若超时则返回false

Shared_mutex

多读者,单写者的共享互斥量(读写锁)

 

相应的常用成员函数:

void lock(); //锁定,否则阻塞

void unlock(); // 解锁

bool try_lock(); //尝试锁定,但不会阻塞

bool try_lock_for(const duration &rel_time); //timed_ 特有,阻塞一段时间后尝试锁定

bool try_lock_until(const time_point &t);// timed_ 特有,阻塞一段时间后尝试锁定

 

4.关于互斥量的几个常用辅助

(1)lock_guard()--Mute的优秀辅助

作用:此类辅助锁定互斥量,构造时锁定,析构时解锁,避免遗忘解锁,也就是说在其作用域内他会一直锁定要求的变量。

(2)unique_lock()--升级的lock_guard(),选项相对较多

 unique_lock(Lockable & mu) ;//锁定

 unique_lock(Lockable & mu,boost::adopt_lock_t);//不锁定,但会解锁

 unique_lock(Lockable & mu,boost::defer_lock_t);//不锁定互斥量

 unique_lock(Lockable & mu,boost::try_to_lock_t);//尝试锁定互斥量

 unique_lock(Lockable & mu,const time_point &t);//超时锁定

转载于:https://www.cnblogs.com/LyndonYoung/articles/7530008.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于生产者消费者问题的描述。以下是一个简单的实现,包含主程序、生产者进程和消费者进程: ```c #include <stdio.h> #include <pthread.h> #include <semaphore.h> #define BUFFER_SIZE 10 char buffer[BUFFER_SIZE]; int buffer_index; pthread_mutex_t mutex; sem_t full, empty; void *producer(void *arg) { while (1) { // 生成数据项 char item = 'A' + rand() % 26; // 若缓冲区满,等待信号empty sem_wait(&empty); // 获取互斥锁mutex pthread_mutex_lock(&mutex); // 将数据项放入缓冲区 buffer[buffer_index++] = item; // 释放互斥锁mutex pthread_mutex_unlock(&mutex); // 发送信号full sem_post(&full); } } void *consumer(void *arg) { while (1) { // 若缓冲区空,等待信号full sem_wait(&full); // 获取互斥锁mutex pthread_mutex_lock(&mutex); // 取出缓冲区中的数据项 char item = buffer[--buffer_index]; // 释放互斥锁mutex pthread_mutex_unlock(&mutex); // 发送信号empty sem_post(&empty); // 处理数据项 printf("Consumed item: %c\n", item); } } int main() { buffer_index = 0; // 初始化互斥和信号 pthread_mutex_init(&mutex, NULL); sem_init(&full, 0, 0); sem_init(&empty, 0, BUFFER_SIZE); // 创建消费者线程和生产者线程,启动线程 pthread_t producer_thread, consumer_thread; 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); sem_destroy(&full); sem_destroy(&empty); return 0; } ``` 这个程序中,我们首先定义了一个缓冲区数组和一个缓冲区索引变,用于存放生产者生成的数据项。接着,我们定义了一个互斥mutex和两个信号full、empty,分别表示缓冲区是否满或空。 在生产者进程中,我们使用while循环不断生成数据项。如果缓冲区已满,使用sem_wait()函数等待信号empty。获取互斥锁mutex后,将数据项放入缓冲区中,然后释放互斥锁mutex。最后,使用sem_post()函数发送信号full,通知消费者进程可以从缓冲区中取出数据项了。 在消费者进程中,我们也使用while循环不断消费数据项。如果缓冲区为空,使用sem_wait()函数等待信号full。获取互斥锁mutex后,从缓冲区中取出数据项,并将缓冲区索引减一。然后,释放互斥锁mutex,并使用sem_post()函数发送信号empty,通知生产者进程可以向缓冲区中放入数据项了。最后,我们处理取出的数据项,并输出到控制台上。 在主程序中,我们首先初始化互斥和信号。然后,创建消费者线程和生产者线程,并启动线程。最后,使用pthread_join()函数等待子线程完成后,销毁互斥和信号。 希望我的回答能够解决你的问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值