条件锁pthread_cond_t

(1)pthread_cond_wait的使用

等待线程
1. 使用pthread_cond_wait前要先加锁
2. pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活
3. pthread_cond_wait被激活后会再自动加锁

(2)pthread_cond_signal的使用

激活线程:
1. 加锁(和等待线程用同一个锁)
2. pthread_cond_signal发送信号
3. 解锁
激活线程的上面三个操作在运行时间上都在等待线程的pthread_cond_wait函数内部。

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>struct msg {
struct msg* next;
int data;
};
struct msg* tasks = NULL; pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* TestWait(void* args) {
pthread_mutex_lock(&mu);//这里开始时加锁
while() {
pthread_cond_wait(&cond, &mu);//该函数首先将当前线程加入内部的等待列表中,然后释放锁,接着休眠并阻塞。。。。。直到有外部信号(pthread_cond_signal)通知,会加锁然后返回。
printf("%ld wake up\n", pthread_self());
if (tasks != NULL) {
struct msg* tsk = tasks;
tasks = tasks->next;
printf("tid:%ld data:%ld\n", pthread_self(), tsk->data);
free(tsk);
}
}
pthread_mutex_unlock(&mu);
pthread_exit(NULL);
} int main() { pthread_t tids[];
for(int i = ; i < ; i++) {
pthread_create(&tids[i], NULL, TestWait, NULL);
}
sleep(); for (int i = ; i < ; i++) {
pthread_mutex_lock(&mu); struct msg* tmp = (struct msg*) malloc(sizeof(struct msg));
tmp->next = tasks;
tmp->data = ;
tasks = tmp; pthread_cond_signal(&cond);
//pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mu);
} pthread_exit(NULL);
return ;
}

pthread_cond_t的更多相关文章

  1. 条件变量pthread_cond_t怎么用

    #include <pthread.h> #include <stdio.h> #include <stdlib.h> pthread_mutex_t mutex ...

  2. 通用线程:POSIX 线程详解,第 3 部分 条件互斥量(pthread_cond_t)

    使用条件变量提高效率 本文是 POSIX 线程三部曲系列的最后一部分,Daniel 将详细讨论如何使用条件变量.条件变量是 POSIX 线程结构,可以让您在遇到某些条件时“唤醒”线程.可以将它们看作是 ...

  3. Linux多线程编程详细解析----条件变量 pthread_cond_t

    Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ...

  4. 关于一点pthread_cond_t条件锁的思考以及实验

    转:http://blog.csdn.net/aniao/article/details/5802015 APUE上,关于条件锁.其中有这么几条总结: 1.使用条件锁前必须先锁住对应的互斥锁. 2.条 ...

  5. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程

    为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...

  6. POSIX多线程编程-条件变量pthread_cond_t

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其它 ...

  7. pthread_mutex_t & pthread_cond_t 总结

    pthread_mutex_t & pthread_cond_t 总结 一.多线程并发 1.1 多线程并发引起的问题 我们先来看如下代码: #include <stdio.h> # ...

  8. int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restric mutex)

    mutex:为了保护条件变量而存在的: cond:为了线程通信而存在的. 整个机制都是为了保护条件变量和线程间通信而存在的. pthread_cond_wait()函数一进入wait状态就会自动rel ...

  9. 《Note --- Unreal --- MemPro (CONTINUE... ...)》

    Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...

随机推荐

  1. MongoDB-比较符及修改器

    数学比较符 $lt 小于 $lte 小于等于 $gt 大于 $gte 大于等于 $eq 等于 $ne 不等于 所有数据 > db.stutent.find() }) { "_id&qu ...

  2. 二十七、Linux内核管理

    内核组成: uname命令 内核:uname,mkinitrd,dracut 模块: lsmod,modinfo,depmod,modprobe,insmod,rmmod /proc,sysctl,/ ...

  3. Shell基础之四 变量与运算

    shell变量与运算 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$号,只有引用变量的值时才使用$号.也就是说在内存中,标记变量的变量名称是str,而不是$str. 变量数据的存储方式 ...

  4. 软件构造实验二-拷贝一个c文件 将其中的关键字int替换成float

    1,新建 Parser Generator 点击project --> new 2,填写工程名字 随意取一个名字 点击OK 3,点击Project选项下的 parserwizard 分析器向导选 ...

  5. Python学习日记(三)——Python基本数据类型(运算符、int、str、tuple、dict、range)

    运算符 1.算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2 ...

  6. How to appraise Hearthstone card values

    https://elie.net/blog/hearthstone/how-to-appraise-hearthstone-card-values/ In 2014, I became an avid ...

  7. 非局部模块(Non Local module)

    Efficient Coarse-to-Fine Non-Local Module for the Detection of Small Objects 何恺明提出了非局部神经网络(Non-local ...

  8. 文件上传对servlet的要求

    request.getParamter(String name)方法不能再使用了 需要使用request.getInputStream()获取输入流对象然后在进行读取数据 解析数据 ServletIn ...

  9. Servlet 的三种跳转方式

    1.Forword request.getRequestDispatcher (“url”).forword (request,response) 是请求转发,也就是说,一个 Servlet 向当前的 ...

  10. shared pointer

    #include <string>#include <fstream>#include <memory>#include <cstdio> class ...