pthread 立即停止线程_请问怎么用pthread库实现线程的启动和暂停

本文探讨了在Linux环境下利用pthread库实现线程启动与暂停的方法。介绍了通过条件变量和互斥锁来控制工作线程的运行状态,实现了主线程对工作线程的精确控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

请教如何用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

{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值