信号丢失问题
来源:互联网 发布:知乎 江歌 贫困生 编辑:程序博客网 时间:2024/04/30 15:27
当标志没有被设置的时候,线程会不断循环检测这个标志,同时会不断锁定、解锁互斥体,浪费 CPU
-
thread_function中的循环首先锁定互斥体并且读取标志变量的值。 -
如果标志变量已经被设定,该线程将互斥体解锁然后执行工作函数 -
如果标志没有被设置,该线程自动锁定互斥体并开始等待条件变量的信号
参数是一个指向 pthread_cond_t 类型变量的指针。
The mutex passed to pthread_cond_wait protects the condition.The caller
上面是APUE的原话,就是说pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)
函数传入的参数mutex用于保护条件,因为我们在调用pthread_cond_wait时,如果条件不成立我们就进入阻塞,但是进入阻塞这个期间,如果条件变量改变了的话,那我们就漏掉了这个条件。因为这个线程还没有放到等待队列上,所以调用pthread_cond_wait前要先锁互斥量,即调用pthread_mutex_lock(),pthread_cond_wait在把线程放进阻塞队列后,自动对mutex进行解锁,使得其它线程可以获得加锁的权利。这样其它线程才能对临界资源进行访问并在适当的时候唤醒这个阻塞的进程。当pthread_cond_wait返回的时候又自动给mutex加锁。
实际上边代码的加解锁过程如下:
pthread_mutex_lock(&qlock);
pthread_cond_wait(&qready, &qlock);
pthread_mutex_unlock(&qlock);
一般修改标志变量,经过以下步骤:
1.
2.
3.
4.
pCond.c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
int
pthread_cond_t pCond;
pthread_mutex_t mutex;
void initialize_flag()
{
}
void set_thread_flag (int flag_value)
{
}
void* thread_fun1()
{
}
void *thread_fun2()
{
}
int main()
{
pthread_t id1,id2;
pthread_create(&id1,NULL,thread_fun1,NULL);
pthread_create(&id2,NULL,thread_fun2,NULL);
initialize_flag();
printf("main thread is running\n");
sleep(20);
return 0;
}
main thread
thread
thread 1 is running
thread 1 is running
thread 1 is running
.......
因为线程1阻塞,至到线程2运行,给于信号后,线程1才开始运行
条件变量也可以用于不涉及程序状态的情况,而仅用作一种让一个线程阻塞等待其它线程唤醒的机制。信号量也可用于这个目的。两者之前的主要区别是,当没有线程处于阻塞状态的时候信号量会“记住”唤醒下一个被阻塞的线程,而条件变量只是简单地丢弃这个信号。另外,信号量只能发送一个唤醒信息给一个线程,而 pthread_cond_broadcast 可以同时唤醒不限数量的可以被唤醒的线程。
- 信号丢失问题
- Linux信号丢失问题分析
- Linux c 信号丢失问题
- 信号问题
- session丢失问题
- Session丢失问题总结
- php session 丢失问题
- Session丢失问题总结
- Session丢失问题总结
- Session丢失问题总结
- Session丢失问题
- php---session 丢失问题
- Session丢失问题
- session丢失问题
- session丢失问题
- vs2008模板丢失问题
- Session丢失的问题!
- Webloogic Session丢失问题
- 解决bug:The content of the adapter has changed but ListView did not receive a notification
- VB.NET 给DataGrid加上右键菜单
- java调用matlab代码方法[matlab version 2010a]
- PXE及PXE启动
- libsvm在64位linux下matlab编译
- 信号丢失问题
- POJ-1977 很好的矩阵乘法题..
- C/C++中指针和引用之相关问题研究
- CSDN 论坛无名游戏 C++版
- 21种工作流模式
- 众数问题
- GS语言更新到V3.0
- The way to Install qemu and kvm (qemu-kvm) in suse 11
- SQL SERVER 2012 DQS练习-数据净化