当前位置: C语言 -- 标准库 -- <threads.h> -- thrd_sleep

thrd_sleep函数


概要:
#include <threads.h>
int thrd_sleep(const struct timespec *duration, struct timespec *remaining);

描述:

该函数暂停调用线程的执行,直至经过参数duration指定的时间间隔或者接收到不能被忽略的信号。如果暂停是由于接收到信号而中断,并且参数remaining不是空指针,剩余的暂停时间将存储到参数remaining指向的对象中。参数duration和参数remaining可以指向相同对象。

由于暂停时间会被舍入到系统时间分辨率的整数倍或者由于系统对其它活动的调度,线程实际暂停时间可能大于请求的暂停时间。除被信号中断的情况外,线程暂停时间(使用系统时钟TIME_UTC测量。)不会小于参数duration指定的时间。


参数:
const struct timespec *duration

指向struct timespec类型对象的指针,该对象指定线程暂停时间。

struct timespec *remaining

指向struct timespec类型对象的指针,该对象存储由于信号原因剩余的线程暂停时间。


返回值:

如果暂停了函数请求的时间,函数返回0;如果暂停被信号中断,函数返回-1;如果调用失败,函数返回一个负值(该负值也可能是-1。)。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
/*函数thrd_sleep范例*/

#ifdef __STDC_NO_THREADS__
#error "Implementation does not support multi-threads."
#endif

#include <stdio.h>
#include <stdlib.h>
#include <threads.h>
#include <time.h>

#define LENGTH 80

/*获取当前时间的函数。*/
void currentTime(void)
{
    char buffer[LENGTH];
    struct timespec ts;
    
    timespec_get(&ts, TIME_UTC);
    strftime(buffer, sizeof(buffer), "%F %T", gmtime(&ts.tv_sec));
    printf("UTC time:%s\n", buffer);
}

/*新线程中执行的函数。*/
int func(void *arg)
{
    currentTime();
    thrd_sleep(&(struct timespec){*((int *)arg), 0}, NULL);
    currentTime();
    
    return 0;
}

int main(void)
{
    int duration = 5;  //线程挂起时间,单位:秒。
    thrd_t threadId;
    
    /*创建新线程。*/
    if (thrd_create(&threadId, func, &duration) != thrd_success)
    {
        perror("thrd_create error");
        exit(EXIT_FAILURE);
    }
    
    /*连接线程。*/
    thrd_join(threadId, NULL);
    
    return 0;
}


输出:

UTC time:2018-03-07 01:08:00

UTC time:2018-03-07 01:08:05

注:使用Pelles C编译。


相关内容:
thrd_current 标识调用线程的函数。
thrd_detach 分离线程的函数。
thrd_equal 测试两个线程是否为同一线程的函数。
thrd_exit 终止当前线程的函数。
thrd_join 连接线程的函数。
thrd_create 创建线程的函数。
thrd_yield 让其它线程运行的函数。