linux多线程编程---条件变量
来源:互联网 发布:c语言函数库详解 编辑:程序博客网 时间:2024/04/28 20:01
pthread_cond_wait(&cond, &mutex) 线程解开mutex指向的锁并被条件变量cond阻塞
pthread_cond_signal(&cond) 释放阻塞在条件变量(cond)上的线程
#include <pthread.h>
#include <string.h>
#include <errno.h>
#include <iostream>
using std::cout;
using std::endl;
pthread_mutex_t mutex;
static pthread_cond_t cond;/* 不能由多个线程同时初始化一个条件变量 */
int cnt = 0;
int estatus = -1;
void *run1(void *);
void *run2(void *);
int main()
{
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL); /* 缺省属性,只适用于同一个进程中的多线程 */
pthread_t tid1, tid2;
int ret = pthread_create(&tid1, NULL, run1, NULL);
if (0 != ret)
cout << "Create Thread1 Failed " << strerror(errno) << endl;
ret = pthread_create(&tid2, NULL, run2, NULL);
if (0 != ret)
cout << "Create Thread2 Failed " << strerror(errno) << endl;
sleep(5);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
void *run1(void *arg)
{
pthread_mutex_lock(&mutex);
cout << "Thread1 begin-------" << cnt << endl;
/* 阻塞在 cond 上的线程被唤醒以后,直到pthread_cond_wait()函数返回之前
cnt 都有可能发生变化,所以需要重新测试条件 */
while (0 == cnt)
{
cout << "Thread1 wait-----" << endl;
pthread_cond_wait(&cond, &mutex);
}
--cnt;
cout << "Thread1 --cnt = " << cnt << endl;
pthread_mutex_unlock(&mutex);
cout << "Thread1 end-------" << cnt << endl;
return &estatus;
}
void *run2(void *arg)
{
pthread_mutex_lock(&mutex);
cout << "Thread2 begin------" << cnt << endl;
if (0 == cnt)
{
cout << "Thread2 send signal" << endl;
pthread_cond_signal(&cond);
}
++cnt;
cout << "Thread2 ++cnt = " << cnt << endl;
pthread_mutex_unlock(&mutex);
cout << "Thread2 end-----" << cnt << endl;
return &estatus;
}
--------------------------
/*
是否熟悉POSIX多线程编程技术?如熟悉,编写程序完成如下功能:
1)有一int型全局变量g_Flag初始值为0;
2)在主线称中起动线程1,打印“this is thread1”,并将g_Flag设置为1
3)在主线称中启动线程2,打印“this is thread2”,并将g_Flag设置为2
4)线程序1需要在线程2退出后才能退出
5)主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出
*/
#include <pthread.h>
#include <errno.h>
#include <string.h> /* strerror */
#include <stdlib.h> /* exit */
#include <iostream>
using std::cout;
using std::endl;
void *run1(void *);
void *run2(void *);
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int nFlag = 0;
void *run1(void *arg)
{
pthread_mutex_lock(&mutex);
cout << "Thread1 nFlag = " << nFlag << endl;
if (2 == nFlag)
{
pthread_cond_signal(&cond);
cout << "Thread1 send signal 2--->1" << endl;
}
nFlag = 1;
cout << "Thread1 In Locked--> nFlag = " << nFlag << endl;
pthread_mutex_unlock(&mutex);
cout << "Thread1 terminated" << endl;
pthread_exit(0);
}
void *run2(void *arg)
{
pthread_mutex_lock(&mutex);
cout << "Thread2 nFlag = " << nFlag << endl;
if (1 == nFlag)
{
pthread_cond_signal(&cond);
cout << "Thread2 send signal 1--->2" << endl;
}
nFlag = 2;
cout << "Thread2 In Locked--> nFlag = " << nFlag << endl;
pthread_mutex_unlock(&mutex);
//pthread_join(*(pthread_t *)arg, NULL);
cout << "Thread2 terminated" << endl;
pthread_exit(0);
}
int main()
{
pthread_t tid1, tid2;
int ret;
ret = pthread_create(&tid1, NULL, run1, NULL);
if (ret)
cout << "Create Thread1 Fail error = " << errno << "->"<< strerror(errno) << endl;
ret = pthread_create(&tid2, NULL, run2, NULL);
if (ret)
cout << "Create Thread2 Fail error = " << errno << "->" << strerror(errno) << endl;
pthread_cond_wait(&cond, &mutex);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
cout << "main thread terminated" << endl;
exit(0);
}
- Linux多线程编程-条件变量
- linux多线程编程---条件变量
- Linux多线程编程-条件变量
- Linux多线程编程---条件变量
- Linux编程练习 --多线程4--条件变量
- Linux多线程编程下的条件变量
- linux多线程编程4--条件变量
- Linux编程练习 --多线程4--条件变量
- Linux 多线程编程( POSIX )( 五 )----->条件变量
- linux多线程编程4--条件变量
- linux 多线程编程 互斥锁与条件变量
- Linux编程练习 --多线程4--条件变量
- Linux 多线程编程( POSIX )( 五 )----->条件变量
- Linux多线程编程详解----条件变量pthread_cond_t
- Linux多线程编程的条件变量
- Linux多线程编程详解----条件变量pthread_cond_t
- Linux多线程编程之条件变量
- Linux C 多线程编程条件变量
- ASSB Status
- POJ 2923(dp + 状态压缩)
- Linq to sql:论坛表结构
- ZOJ 3630 Information 强连通
- 3xian之所在
- linux多线程编程---条件变量
- char码值对应列表大全
- Ant系列一:◎什么是Ant
- Storm源码阅读(二):客户端
- Android之PopuWindow简单学习
- Windows下使用开源数学库
- Linq to sql:实体继承的使用
- IOS学习之路九(配置restful webservice 框架restkit)
- 关于java接口