C语言线程不阻塞超时
时间: 2025-02-07 20:19:31 浏览: 24
在C语言中,创建线程并让其等待某个操作通常需要使用到pthread_join()
函数。这个函数会阻塞当前线程,直到指定的线程完成执行。如果想要实现非阻塞的、带有超时功能的线程等待,可以结合信号量(semaphores)或者条件变量(condition variables)来实现。
一种常用的做法是通过sem_timedwait()
函数配合信号量,这个函数允许线程在一个给定的时间间隔后返回,而不是无限期地阻塞。例如:
#include <semaphore.h>
#include <time.h>
void *thread_function(void *arg) {
sem_t my_sem;
int status;
// 初始化信号量
sem_init(&my_sem, 0, 1);
// 设置超时时间
struct timespec timeout = {0, 500000000}; // 5秒
// 调用带超时的信号量操作
status = sem_timedwait(&my_sem, &timeout);
if (status == -1 && errno == ETIMEDOUT) {
printf("Thread timed out.\n");
} else {
printf("Thread completed normally.\n");
}
// 线程结束前释放信号量
sem_destroy(&my_sem);
return NULL;
}
int main() {
pthread_t thread_id;
pthread_create(&thread_id, NULL, thread_function, NULL);
// 主线程在此处继续运行...
// 当主线程认为它需要线程完成时,可以尝试唤醒等待的线程
sem_post(&my_sem); // 这将不会阻塞主线程
pthread_join(thread_id, NULL);
return 0;
}
在这个例子中,主线程先启动一个工作线程,然后设置一个超时时间。如果工作线程在指定时间内未完成任务(这里是5秒),sem_timedwait()
会立即返回,并在线程函数中打印出“Thread timed out.”。
相关推荐

















