sem_timedwait
是 POSIX(便携式操作系统接口)标准定义的一个同步原语,用于线程或进程同步中的信号量操作。在涉及多线程编程时,信号量(semaphore)是用来控制对共享资源或临界区域访问的一种机制。
sem_timedwait
函数对信号量执行减操作(通常称为wait 或 P 操作),如果信号量的值大于0,那么该函数将信号量的值减1并立即返回;如果信号量的值为0,则调用线程将被阻塞。不同于`sem_wait`函数,`sem_timedwait`允许你设置一个超时时间——这意味着如果指定的时间内信号量没有被释放(即其值不变为大于0),调用线程会在超时后停止阻塞,这时函数返回-1,并设置errno为ETIMEDOUT,表示已经超时。
可以理解为:
–sem
是信号量的缩写。
–timed
表示这个操作是有时间限制的。
–wait
表示调用此函数的线程将等待(可能阻塞)直到信号量的值变为非零。
函数的原型:
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
参数和返回值:
–sem
是指向信号量对象的指针。
–abs_timeout
指定了一个绝对超时时间,一旦达到这个时间,如果信号量依然没有被释放(即依然为0),则函数会因超时而返回。
函数返回值:
– 如果成功,`sem_timedwait` 函数返回0。
– 如果在指定时间内信号量没有被释放,`sem_timedwait`将返回-1,并设置errno为ETIMEDOUT。
sem_timedwait
是一个有用的工具,可以用来在多线程环境中同步对共享资源的访问,同时提供了超时机制,以避免无限期的等待。
示例代码:
#include #include #include #include sem_t sem;void* worker_thread(void* arg) {// 设置超时时间为2秒后struct timespec ts;clock_gettime(CLOCK_REALTIME, &ts);ts.tv_sec += 2;printf("Thread attempting to acquire the semaphore...\n");// 尝试获取信号量,最多等待2秒if (sem_timedwait(&sem, &ts) == -1) {perror("sem_timedwait");printf("Could not acquire semaphore within 2 seconds.\n");} else {// 成功获取信号量printf("Semaphore acquired by thread.\n");// 释放信号量sem_post(&sem);}return NULL;}int main() {pthread_t tid;// 初始化信号量,初始值为0sem_init(&sem, 0, 0);// 创建线程pthread_create(&tid, NULL, worker_thread, NULL);// 等待一段时间,例如1秒sleep(1);// 释放信号量printf("Main thread signals semaphore.\n");sem_post(&sem);// 等待线程完成pthread_join(tid, NULL);// 销毁信号量sem_destroy(&sem);return 0;}
在上面的代码示例中,创建了一个线程,该线程尝试使用sem_timedwait
函数获取一个信号量。超时时间设置为当前时间后的2秒。主线程休眠1秒后发出信号,从而释放信号量。子线程获取信号量后,会释放它。如果子线程在超时之前无法获取信号量,则会打印错误消息。