C语言线程函数

除了创建线程的 thread_create()函数、获取返回值的 thread_join()函数和释放线程占用资源的 thread_detach()函数,C11 还提供了另外用于线程控制的 5 个函数:

thrd_t thrd_current(void);
该函数返回其所在线程的线程标识。

int thrd_equal(thrd_t thr0,thrd_t thr1);
仅当两个线程标识符 thr0、thr1 分别引用了两个不同线程时,返回 0。

int thrd_sleep(const struct timespec*duration,struct timespec*remaining);
使得正在调用的线程等待一段时间,等待时间由 duration 指定。仅当该函数收到唤醒的信号时,它才提前返回。在这种情况下,该函数将剩余倒数时间保留在 remaining 引用的对象中,假设 remaining 不是一个空指针。指针 duration 和 remaining 不得指向同一个对象。

结构参数 timespec 有两个成员,分别用于存储秒和纳秒:
time_t tv_sec;              // 秒≥0
long   tv_nsec;                  // 0 ≤纳秒≤999 999 999

结构中成员的顺序未被指定。在下面的例子中,除非通过信号来唤醒,否则正在调用的线程将等待至少 100 毫秒:
struct timespec duration = {0};
duration.tv_nsec = 100*1E6;      // 1毫秒 = 1 000 000纳秒
thrd_sleep(&duration,NULL);  // 休眠100毫秒
如果倒计时完成,则 thrd_sleep()返回 0;如果线程函数由一个信号唤醒,即实现提前返回,则 thrd_sleep()返回 -1。其他负数返回值表示错误。

void thrd_yield(void);
该函数建议操作系统调度器中断当前调用的线程,并将 CPU 时间分给另一个线程。

_Noreturn void thrd_exit(int result);
以 result 作为结果值结束正在调用线程。在线程中执行的所有函数都可以调用 thrd_exit()。该函数调用相当于在线程函数中执行语句 return result;。最后一个线程退出后,整个程序将正常退出,换句话说,它类似于调用具有参数 EXIT_SUCCESS 的函数 exit()。