【linux 多线程并发】多线程的控制,挂起线程暂停运行,直到唤醒线程,取消线程运行,可以设置合适的取消点属性避免不安全点被中止
在Linux中,可以使用pthread库中的函数来控制线程的行为,如挂起线程(暂停运行),唤醒线程,取消线程等。以下是一些常用的函数和示例代码:
pthread_create
- 创建新线程pthread_exit
- 终止当前线程pthread_join
- 等待另一个线程终止pthread_cancel
- 请求取消另一个线程pthread_setcancelstate
- 设置线程的取消状态pthread_setcanceltype
- 设置线程的取消类型pthread_testcancel
- 检查是否有取消请求并在适当的点取消
示例代码:
#include <pthread.h>
#include <stdio.h>
void* thread_function(void* arg) {
printf("Thread starting...\n");
// 模拟长时间运行的任务
for (int i = 0; i < 10; ++i) {
printf("Thread running...\n");
sleep(1);
}
return NULL;
}
int main() {
pthread_t thread;
// 创建线程
pthread_create(&thread, NULL, &thread_function, NULL);
// 等待线程结束
pthread_join(thread, NULL);
printf("Thread finished.\n");
return 0;
}
在上面的例子中,pthread_create
用于创建新线程,pthread_join
用于等待线程结束。这是一个同步机制,主线程会等待新创建的线程完成其任务。
如果你想要取消线程的运行,可以使用pthread_cancel
函数,但是这需要线程内部定期检查是否被取消,并在合适的时候终止。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function(void* arg) {
printf("Thread starting...\n");
while(1) {
printf("Thread running...\n");
sleep(1);
int cancel = pthread_cancel(pthread_self()); // 尝试取消自己
if (cancel == PTHREAD_CANCELED) {
printf("Thread was cancelled.\n");
return NULL;
}
}
return NULL;
}
int main() {
pthread_t thread;
pthread_create(&thread, NULL, &thread_function, NULL);
sleep(5); // 等待5秒后尝试取消线程
pthread_cancel(thread);
pthread_join(thread, NULL);
printf("Thread finished.\n");
return 0;
}
在上面的例子中,pthread_cancel
用于请求取消线程,而线程函数内部通过pthread_self()
获取自己的线程ID,并在循环中尝试取消自己。如果成功,线程会打印一条消息并退出。注意,实际上完全取消一个线程并不会立即发生,除非线程内部调用了pthread_testcancel
或者已经执行了一个可以取消点的函数。
评论已关闭