概述
#include<pthread.h>
#include<unistd.h>
#include<iostream>
#include<time.h>
#include<errno.h>
#include<sys/time.h>
using namespace std;
// 初始化互斥量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 初始化条件变量
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 进程是否终止
bool terminal = 1;
// 唤醒所有线程
void notifyAll()
{
int ret;
ret = pthread_mutex_lock(&mutex);
if(ret < 0)
{
cerr << "mutex lock error:" << ret << endl;
return ;
}
// 改变条件
terminal = 0;
// 通知所有线程,条件已经改变
ret = pthread_cond_broadcast(&cond);
if(ret < 0)
{
cerr << "pthread_cond_broadcast error : " << ret << endl;
}
ret = pthread_mutex_unlock(&mutex);
if(ret < 0)
{
cerr << "pthread_mutex_unlock error :" << ret << endl;
return;
}
}
void *thread1(void *arg)
{
int i = 0;
struct timeval tp;
struct timespec time;
int ret;
while(terminal)
{
// 等待时间设为3s
gettimeofday(&tp,NULL);
time.tv_sec = tp.tv_sec;
time.tv_nsec = tp.tv_usec * 1000;
time.tv_sec += 3;
i++;
cout << pthread_self() << "|" << i << endl;
// 调用pthread_cond_timedwait前必须给互斥量加锁
ret = pthread_mutex_lock(&mutex);
if(ret < 0)
{
cout << "pthread_mutex_lock error:" << ret << endl;
pthread_exit(NULL);
}
ret = pthread_cond_timedwait(&cond,&mutex,&time);
if(ret < 0)
{
cerr << "pthread_cond_timedwait error:" << ret << endl;
pthread_exit(NULL);
}
if(ret == ETIMEDOUT)
{
cout << pthread_self() << " time out " << endl;
}
else
{
cout << pthread_self() << " cond change" << endl;
}
sleep(1);
ret = pthread_mutex_unlock(&mutex);
if(ret < 0)
{
cerr << "pthread_mutex_unlock error:" << ret << endl;
pthread_exit(NULL);
}
}
}
int main()
{
// 创建两个线程
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,thread1,NULL);
pthread_create(&tid2,NULL,thread1,NULL);
sleep(1);
notifyAll();
sleep(5);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
最后
以上就是搞怪枫叶为你收集整理的条件锁的使用的全部内容,希望文章能够帮你解决条件锁的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复