关于条件变量

最近打算在写一个网络库,涉及到对mutex、condition的封装,再次使用Linux提供的接口,发现一个问题,使用condition的时候需要配合一个mutex来使用。

上面是关于pthread_cond_wait的man手册说明,意思就是再调用pthread_cond_wait之前需要把mutex上锁,pthread_cond_wait会自动解锁,然后等待条件变量被signal,执行线程会被挂起并不会消耗任何CPU时间,知道条件变量被signal。在返回到调用线程之前,pthread_cond_wait会重新获取锁(如果获取不到锁,会阻塞)。

我想要测试就是最后一点,如果在返回的时候获取不到锁,会不会阻塞,以及想知道为什么需要与一个mutex配合使用。

测试代码:

 1 /*
 2 * 测试pthread_cond_wait
 3 */
 4 #include <unistd.h>
 5 #include <pthread.h>
 6
 7 #include <stdio.h>
 8
 9 pthread_mutex_t mutex;
10 pthread_cond_t cond;
11
12 void* mutex_func(void *arg)
13 {
14     // wait cond_func get the lock
15     printf("lock after 5s\n");
16     sleep(5);
17     pthread_mutex_lock(&mutex);
18
19     pthread_cond_signal(&cond);
20
21     printf("unlock after 5s\n");
22     sleep(5);
23     pthread_mutex_unlock(&mutex);
24 }
25
26 void* cond_func(void *arg)
27 {
28     // lock
29     pthread_mutex_lock(&mutex);
30
31     pthread_cond_wait(&cond, &mutex); // unlock and block
32     printf("get signal\n");
33
34     pthread_mutex_unlock(&mutex);
35     // acquire lock, will block
36     printf("cond_func\n");
37 }
38
39 int main(void)
40 {
41     pthread_mutex_init(&mutex, NULL);
42     pthread_cond_init(&cond, NULL);
43
44     pthread_t pid1, pid2;
45     pthread_create(&pid1, NULL, mutex_func, NULL);
46     pthread_create(&pid2, NULL, cond_func, NULL);
47
48     pthread_join(pid1, NULL);
49     pthread_join(pid2, NULL);
50
51     return 0;
52 }

输出结果:

结论:

根据输出结果可以知道,确实是它需要的mutex释放之后才从pthread_cond_wait返回的。此处可以推测(需要看源码验证)pthread_cond_wait是去查看某一个条件是否为真来决定是否返回的(那么就涉及到了race condition),所以需要使用mutex来保护。

源码验证:

时间: 2024-11-05 18:35:17

关于条件变量的相关文章

Java并发程序设计(16)并发锁之条件变量

1.1.1. 条件变量应用之等待通知 条件变量Condition提供了一种基于ReentrantLock的事件等待和通知的机制,并且可以监控任意指定的条件,在条件不满足时等待条件满足,其它线程在条件满足时可以通知等待条件的线程,从而唤醒等待中的线程. 下面的代码实现了两件工作分别由两个线程轮流不断执行的效果. package com.test.concurrence; import java.util.concurrent.locks.Condition; import java.util.co

线程同步(条件变量、信号量)以及死锁

死锁:指两个或两个以上进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待现象,若无外力作用,它们都将无法继续推进下去. 例:交叉死锁:线程1获得了锁1,线程2获得了锁2,此时线程1调用lock想获得锁2,需挂起等待线程2释放锁2,而线程2也想获得锁1,也需挂起等待线程1释放锁1,此时两个线程都挂起等待 产生死锁的四个必要条件: (1):互斥条件(一个资源每次只能被一个进程或线程使用) (2):请求与保持条件(一个进程或线程因请求资源而阻塞时,对已获得的资源不释放) (3):不剥夺条件(此

条件变量函数

#include <pthread.h> #include <stdio.h> #include <stdlib.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/ void *thread1(void *); void *thread2(void *); int i=1; in

C++11并行编程-条件变量(condition_variable)详细说明

<condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status.另外还包含函数 std::notify_all_at_thread_exit(),以下分别介绍一下以上几种类型. std::condition_variable 类介绍 std::condition_variable是条件变量,很多其它有关条件变量的定义

详解条件变量

一年多过去啦,一段时间没有posix多线程的东西,又忘记的差不多略,我打记性咋这么差,丝毫记不起来怎么用啦,还是不如烂笔头啊. 大家都知道条件变量需要配合mutex一起使用,往往是这样的:lock->signal->unlock,  而另一边呢是: lock->wait->unlock. 在调用pthread_cond_wait(cond,mutex)时的执行顺序是这样的:1. 首先获取外面的mutex, 然后当前wait push 到一个等待的queue里面,然后释放锁.但是你看

信号量、互斥量、同步变量、条件变量和事件变量

信号量:信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦该关键代码段完成了,那么该线程必须释放信号量.其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量.为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端.确认这些信号量VI引用的是初始创建的

线程通信(二)—— 条件变量

上篇提到线程针对临界值操作时需要加锁,但是线程访问临界资源只通过锁来控制是不够的. 比如对一个数据进行操作,A线程需要读,B线程进行写. A线程先访问临界资源,发现没有数据可以读,只能等待B线程先写,此时又占用了互斥锁,导致B线程无法得到锁,进行写操作. 此时就需要用到条件变量了,条件变量的目的就是控制线程的先后执行,保证临界资源的有效性. 下面依然是售票的一个场景,此时一个线程售票,一个线程退票. 1 #include <pthread.h> 2 #include <unistd.h&

pthread的条件变量初探

本期研究一下Pthreads的条件变量.从网上找到了一个学习笔记,请看"cnblogs-blueclue's tech blog-POSIX线程库条件变量的使用--Pthreads线程库实例笔记4". 在windows上测试了一下该代码,稍作改动, 粘贴如下: 其中有几点需要注意: 延时函数是Sleep(),在头文件<windows.h>中.该函数用于延时某一线程的执行: 轮询次数设置为while循环的条件,在信号发送和接受函数中,轮询次数应当保持一致: #include 

Linux Condition Variable条件变量避免锁冲突

条件变量Condition Variable的一般用法: 唤醒用法: 1 struct { 2 pthread_mutex_t mutex; 3 pthread_cond_t cond; 4 //whatever variables maintain the condition 5 ) var = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, ... };//声明结构体并初始化 6 7 pthread_mutex_lock(&var

第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)

8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同步机制.其目的让线程以原子方式释放锁并将自己阻塞,直到某一个条件成立为止.如读者线程当没有数据可读取时,则应释放锁并等待,直到写者线程产生了新的数据.同理,当写者把数据结构写满时,那么写者应该释放SRWLock并等待,直到读者把数据结构清空. (2)等待函数:SleepConditionVariab