c++ 条件变量

http://blog.csdn.net/hemmanhui/article/details/4417433

互斥锁:用来上锁。

条件变量:用来等待,当条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。

函数介绍:

名称:

pthread_cond_init

目标:

条件变量初始化

头文件:

include < pthread.h>

函数原形:

int pthread_cond_init(pthread_cond_t cond, const pthread_condattr_t attr);

参数:

cptr 条件变量

attr 条件变量属性

返回值:

成功返回0,出错返回错误编号。

pthread_cond_init函数可以用来初始化一个条件变量。他使用变量attr所指定的属性来初始化一个条件变量,如果参数attr为空,那么它将使用缺省的属性来设置所指定的条件变量。

名称:

pthread_cond_destroy

目标:

条件变量摧毁

头文件:

include < pthread.h>

函数原形:

int pthread_cond_destroy(pthread_cond_t *cond);

参数:

cptr 条件变量

返回值:

成功返回0,出错返回错误编号。

名称:

pthread_cond_wait/pthread_cond_timedwait

目标:

条件变量等待

头文件:

include < pthread.h>

函数原形:

int pthread_cond_wait(pthread_cond_t cond,pthread_mutex_t mutex);

int pthread_cond_timedwait(pthread_cond_t cond,pthread_mutex_t mytex,const struct timespec abstime);

参数:

cond 条件变量

mutex 互斥锁

返回值:

成功返回0,出错返回错误编号。

第一个参数cond是指向一个条件变量的指针。第二个参数mutex则是对相关的互斥锁的指针。函数pthread_cond_timedwait函数类型与函数pthread_cond_wait,区别在于,如果达到或是超过所引用的参数abstime,它将结束并返回错误ETIME.pthread_cond_timedwait函数的参数abstime指向一个timespec结构。该结构如下:

typedef struct timespec{

time_t tv_sec;

long tv_nsex;

}timespec_t;

名称:

pthread_cond_signal/pthread_cond_broadcast

目标:

条件变量通知

头文件:

include < pthread.h>

函数原形:

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);

参数:

cond 条件变量

返回值:

成功返回0,出错返回错误编号。

参数cond是对类型为pthread_cond_t 的一个条件变量的指针。当调用pthread_cond_signal时一个在相同条件变量上阻塞的线程将被解锁。如果同时有多个线程阻塞,则由调度策略确定接收通知的线程。如果调用pthread_cond_broadcast,则将通知阻塞在这个条件变量上的所有线程。一旦被唤醒,线程仍然会要求互斥锁。如果当前没有线程等待通知,则上面两种调用实际上成为一个空操作。如果参数cond指向非法地址,则返回值EINVAL。

下面是一个简单的例子,我们可以从程序的运行来了解条件变量的作用。

include

sleep(1);
}

}

void thread2(void junk)
{
while(i

if(i%3!=0)
pthread_cond_wait(&cond,&mutex);/等待/
printf(“thread2:%d/n”,i);
pthread_mutex_unlock(&mutex);

sleep(1);
}

程序创建了2个新线程使他们同步运行,实现进程t_b打印20以内3的倍数,t_a打印其他的数,程序开始线程t_b不满足条件等待,线程t_a运行使a循环加1并打印。直到i为3的倍数时,线程t_a发送信号通知进程t_b,这时t_b满足条件,打印i值。

下面是运行结果:

cc –lpthread –o cond cond.c

./cond

thread1:1

thread1:2

thread2:3

thread1:4

thread1:5

thread2:6

thread1:7

thread1:8

thread2:9

备注:

pthread_cond_wait 执行的流程首先将这个mutex解锁, 然后等待条件变量被唤醒, 如果没有被唤醒, 该线程将一直休眠, 也就是说, 该线程将一直阻塞在这个pthread_cond_wait调用中, 而当此线程被唤醒时, 将自动将这个mutex加锁,然后再进行条件变量判断(原因是”惊群效应”,如果是多个线程都在等待这个条件,而同时只能有一个线程进行处理,此时就必须要再次条件判断,以使只有一个线程进入临界区处理。),如果满足,则线程继续执行,最后解锁,

也就是说pthread_cond_wait实际上可以看作是以下几个动作的合体:
解锁线程锁
等待线程唤醒,并且条件为true
加锁线程锁.

pthread_cond_signal仅仅负责唤醒正在阻塞在同一条件变量上的一个线程,如果存在多个线程,系统自动根据调度策略决定唤醒其中的一个线程,在多处理器上,该函数是可能同时唤醒多个线程,同时该函数与锁操作无关,解锁是由pthread_mutex_unlock(&mutex)完成

唤醒丢失往往会在下面的情况下发生:

一个线程调用pthread_cond_signal或pthread_cond_broadcast函数; 另一个线程正处在测试条件变量和调用pthread_cond_wait函数之间; 没有线程正在处在阻塞等待的状态下

Original: https://www.cnblogs.com/i80386/p/5028875.html
Author: 雨渐渐
Title: c++ 条件变量

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535330/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++ 求时差

    C++ 求时差的三种方法 【1】标准C库方式 示例代码 【2】C++库方式 C++11之后才引入 示例代码: 【3】windows API方式 示例代码: 为什么第14行,我们把G…

    C++ 2023年5月29日
    089
  • C++ 资源大全

    http://www.uml.org.cn/c++/201411145.asp http://ezlippi.com/blog/2014/12/c-open-project.htm…

    C++ 2023年5月29日
    055
  • C++ d-bus 使用实例

    因为以后工作用的到D-bus,这两天抽空看了下c++下得d-bus的使用方法。因为网上对c++下得d-bus使用说明几乎没有,所以,在这里记录下以供同仁使用。同时感谢shengpe…

    C++ 2023年5月29日
    066
  • const 在 C 和 C++ 中的区别

    1 C 中的 const 内存分配 1.1 修饰全局变量 cpp;gutter:true;</p> <h1>include</h1> <p…

    C++ 2023年5月29日
    054
  • Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)

    序号 书名 原版书名 作者 译者 出版社 页数 年代 定价 备注 1 C++Builder 5程序设计大全 C++Builder 5 Developer’s Guide…

    C++ 2023年5月29日
    040
  • 右值引用与转移语义(C++11)

    参考资料: 左值和右值定义: C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的 左值的定义就是非临时对象(可以取地址,有名字),那些可以在多条语句中使用的对…

    C++ 2023年5月29日
    073
  • vscode配置c++

    在.vscode里创建三个文件 c_cpp_properties.json, launch.json, settings.json, tasks.json c_cpp_proper…

    C++ 2023年5月29日
    079
  • C++Builder及VC的库相互调用

    coff2omf vc.lib bc.lib implib -f xxx.lib xxx.dll dll文件为VC编译的动态库lib文件为你需要转换的c++ builder 使用的…

    C++ 2023年5月29日
    070
  • 面向对象编程技术的总结和理解(c++)

    目录树 1.继承 1.1 基类成员在派生类中的访问属性 1.2继承时导致的二义性 1.3 多基继承 2.虚函数的多态 2.1虚函数的定义 2.2派生类中可以根据需要对虚函数进行重定…

    C++ 2023年5月29日
    046
  • 【转】C++智能指针的正确使用方式

    对象所有权 首先需要理清楚的概念就是对象所有权的概念。所有权在 rust 语言中非常严格,写 rust 的时候必须要清楚自己创建的每个对象的所有权。 但是 C++ 比较自由,似乎我…

    C++ 2023年5月29日
    059
  • C++11 列表初始化

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于…

    C++ 2023年5月29日
    060
  • C++ 有向图最短路径之Dijkstra算法

    摘自:https://blog.csdn.net/chuanzhouxiao/article/details/88831371 一、思路 1.Dijkstra算法 每次都是从起始顶…

    C++ 2023年5月29日
    0107
  • Dijkstra算法(二)之 C++详解

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 基本…

    C++ 2023年5月29日
    053
  • C++:vector中的resize()函数 VS reserve()函数

    http://www.cplusplus.com/reference/vector/vector/vector/ 写代码的时候无意错用了这两个函数 导致测试的时候,程序运行崩溃 发…

    C++ 2023年5月29日
    066
  • android C/C++ source files 全局宏定义 .

    \system\core\include\arch\linux-arm AndroidConfig.h ======================================…

    C++ 2023年5月29日
    087
  • C++11新特性学习

    http://www.cprogramming.com/c++11/c++11-lambda-closures.html Original: https://www.cnblogs…

    C++ 2023年5月29日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球