pthread 唤醒sleep线程并终结
时间: 2023-07-31 19:10:16 浏览: 117
可以使用pthread_cancel()函数终止一个线程,但是这个函数并不是立即终止线程,它只是向目标线程发送一个取消请求,目标线程在收到请求后会在合适的时候进行线程终止操作。如果目标线程正处于阻塞状态(如sleep状态),则该函数会唤醒目标线程,并在目标线程取消时返回。
下面是一个示例代码,展示如何使用pthread_cancel()函数唤醒一个sleep线程并终止它:
```c
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 计时器线程函数
void* timer_thread(void* arg)
{
int count = 0;
while (1) {
printf("Timer: %d\n", count++);
sleep(1);
}
printf("Timer thread terminated.\n");
pthread_exit(NULL);
}
int main()
{
pthread_t tid;
int ret;
// 创建计时器线程
ret = pthread_create(&tid, NULL, timer_thread, NULL);
if (ret != 0) {
printf("Failed to create timer thread.\n");
return -1;
}
// 等待一段时间后终止计时器线程
sleep(5);
printf("Cancel timer thread.\n");
pthread_cancel(tid);
// 等待计时器线程结束
pthread_join(tid, NULL);
printf("Main thread exit.\n");
return 0;
}
```
在上面的示例代码中,我们使用pthread_create()函数创建一个计时器线程,该线程每秒钟打印一个计数器。在主线程中,我们先等待5秒钟,然后使用pthread_cancel()函数终止计时器线程。最后,主线程使用pthread_join()函数等待计时器线程结束。
需要注意的是,使用pthread_cancel()函数终止线程并不是安全的,因为它可能会导致线程在任意时刻被终止,从而导致资源泄露或者数据不一致等问题。如果需要终止线程,最好是在线程中定期检查某个变量,然后在检测到终止请求时进行线程终止操作。
阅读全文