请教如何用pthread库实现线程的启动和暂停?
我在linux上,想用pthread库实现这样的功能:我有2个线程:一个主线程,一个工作线程,在主线程中创建工作线程。工作线程不总是工作,也就是说,创建的时候处于暂停状态或休眠状态(不占cpu),当主线程通知它工作的时候就开始工作。开始工作之后,当主线程需要暂停它的时候可以通知它使它暂停。然后工作线程又处于暂停状态(不占cpu)。之后类似,主线程可以随时通知工作线程开始工作,随时暂停工作线程。
我开始的想法是这样的:
pthread_t thread;
int enable = 0;
void* threadFunc(void* args) //工作线程函数
{
while(1)
{
if(enable)
{
work();
}
else
{
sleep(1);
}
}
return ((void*)0);
}
int main()
{
pthread_create(&thread, NULL, threadFunc, NULL);
enable = 1;
sleep(3);
enable = 0;
...
}
但感觉用sleep不太好,因为sleep的时间其实不好定。太长太短都不好。其实主线程什么时候启动什么时候暂停工作线程,都是确定的。主线程其实是响应用户的请求,用户说开始work就应该马上work,用户说停止就应该马上停止。
后来我想用条件变量,在工作线程中:
pthread_mutex_lock(&mutex));
pthread_cond_wait(&cond,&mutex);
在主线程中:
pthread_cond_signal(&cond);
但是这样只能启动,无法暂停?
不知道各位大侠有没有什么办法?代码应该如何写呢?
多谢了!
------解决方案--------------------
linux下好像没有如Windows下的线程suspend,resume机制。
只能通过你所说的pthread_mutex_lock,pthread_cond_wait等函数实现。
启动控制应该跟你最开始的思路一样,还得需要循环检测,就是把你的enable换成pthread_cond_wait,不需要sleep就是了。
------解决方案--------------------
在工作线程中合适的地方加锁读取一个初值为0的全局变量,如果该全局变量为1,表示主线程希望本子线程暂停;
主线程希望子线程暂停时,加锁设置这个全局变量为1?
------解决方案--------------------
哦。原来是这种需求。
还是按你的思路,把两种方法结合一下。
子线程,判断还是使用enable,但是sleep用pthread_cond_wait来。
主线程,启动的时候先设定Enable=true然后pthread_cond_signal。
停止的时候直接设定Enable=false
但是enable原子操作(atomic_t)来实现安全些。
------解决方案--------------------
#include
#include
#include
#include
pthread_mutex_t mutex_pause = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_pause = PTHREAD_COND_INITIALIZER;
bool pthread_pause = false;
void pthread_suspend(void)
{
if (pthread_pause == false)
{
pthread_mutex_lock( &mutex_pause );
pthread_pause = true;
printf("------pthread pause------/n");
pthread_mutex_unlock( &mutex_pause );
}
else
{