linux里挂起和唤醒指定线程?

zhouxinfengone 2009-03-09 11:06:39
用pthread编程的时候怎么挂起唤醒指定的线程?
比如有线程p1和方法F1,F2
只要调用方法F1就挂起线程p1假设p1是个死循环只是打印用的 然后调用F2就能继续唤醒p1打印 就这么简单的功能怎么实现的?用pthread_join好像不行 有好的方法吗?
...全文
1762 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouxinfengone 2009-03-09
  • 打赏
  • 举报
回复
关键 我只是需要在这个线程外部挂起这个 线程 并不希望它退出 也不会设计到共享资源的问题 只是希望能挂起和唤醒指定的线程而已 不能在线程内部让他自己挂起这个是最主要的!!
  • 打赏
  • 举报
回复
楼上互斥锁的办法不错,Unix高级编程上有样例程序,建议楼主拿书来看看.
  • 打赏
  • 举报
回复
一个简单的问题被你想复杂了.
主线程需要的时候就调用打印用的子线程,让子线程绑定的函数循环打印.
你觉得需要结束了,就在主线程里调用pthread_cancel();结束子线程.

wuyu637 2009-03-09
  • 打赏
  • 举报
回复
Condition Variable (条件变量)

也是一种用于同步的device. 允许一个进程(或线程)将自己挂起等待一个条件变量的状态

被改变.
有下列几个函数:

int pthread_cond_init (pthread_cond_t *COND,pthread_condattr_t *cond_ATTR);
int pthread_cond_signal (pthread_cond_t *COND);
int pthread_cond_broadcast (pthread_cond_t *COND);
int pthread_cond_wait (pthread_cond_t *COND, pthread_mutex_t *MUTEX);
int pthread_cond_timedwait (pthread_cond_t *COND, pthread_mutex_t *MUTEX, const struct timespec *ABSTIME);
int pthread_cond_destroy (pthread_cond_t *COND);

我想看看名字就可以知道它们的用途了. 通常我们也使用静态变量来初始化一个条件变量.
Example:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

pthread_cond_signal 用于唤醒一个被锁定的线程.
pthread_cond_broadcast 用于唤醒所有被锁定的线程.
pthread_cond_wait 用于等待.

为了解决竞争问题(即一个线程刚要去wait而另一个线程已经signal了), 它要与一个mutex连用.

看一看下面的典型的例子。

假设x、y这两个变量被多个线程共享,我们希望这个线程一直等到x和y相等才继续执行这个线程。典型的忙等待方法如下(这是一个错误的方法):

while( x != y );

下面是使用条件变量正确的方法:


pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

//Waiting until X is the same as Y is performed as follows:

pthread_mutex_lock(&mut);
while (x != y) {
pthread_cond_wait(&cond, &mut);
}
/**//* operate on x and y */
pthread_mutex_unlock(&mut);


pthread_cond_wait的执行过程如下:
1. 首先, 它unlock the mutex, then 挂起当前的线程.
2. 当被唤醒的时候, 它会lock the mutex.

这样就保证了这是一个临界区.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧