结构体定义如下:
struct timespec {time_t tv_sec;/* Seconds */longtv_nsec;/* Nanoseconds [0 .. 999999999] */}; 如果指定的阻塞时间到了 , 但是 sem 仍然小于 0, 则会返回一个错误 (错误设置为 ETIMEDOUT ) 。
post(V)post 为信号量值加一操作 , 函数原型如下:
#include int sem_post(sem_t *sem);Link with -pthread.返回值:若成功 , 返回 0 ;若出错 , 返回-1无名信号量接口函数信号量的函数都以sem_开头 , 线程中使用的基本信号函数有4个 , 他们都声明在头文件semaphore.h中 , 该头文件定义了用于信号量操作的sem_t类型:
sem_init
该函数用于创建信号量 , 原型如下:
int sem_init(sem_t *sem, int pshared, unsigned int value);功能:该函数初始化由sem指向的信号对象 , 设置它的共享选项 , 并给它一个初始的整数值 。 pshared控制信号量的类型 , 如果其值为0 , 就表示信号量是当前进程的局部信号量 , 否则信号量就可以在多个进程间共享 , value为sem的初始值 。 返回值:该函数调用成功返回0 , 失败返回-1 。
sem_destroy
该函数用于对用完的信号量进行清理 , 其原型如下:
int sem_destroy(sem_t *sem);返回值:
成功返回0 , 失败返回-1 。
sem_getvalue函数
该函数返回当前信号量的值 , 通过restrict输出参数返回 。 如果当前信号量已经上锁(即同步对象不可用) , 那么返回值为0 , 或为负数 , 其绝对值就是等待该信号量解锁的线程数 。
int sem_getvalue(sem_t *restrict, int *restrict);使用实例
【实例1】:
#include #include #include #include #include #include #include #include sem_t sem;#define handle_error(msg)do { \perror(msg); \exit(EXIT_FAILURE); \}while (0)static void handler(int sig){write(STDOUT_FILENO, "sem_post() from handler\n", 24);if(sem_post(_exit(EXIT_FAILURE);}}int main(int argc, char *argv[]){int s;struct timespec ts;struct sigaction sa;if (argc != 3){fprintf(stderr, "Usage: %s\n", argv[0]);exit(EXIT_FAILURE);}if (sem_init(/* Establish SIGALRM handler; set alarm timer using argv[1] */sa.sa_handler = handler;sigemptyset(sa.sa_flags = 0;if (sigaction(SIGALRM,alarm(atoi(argv[1]));/* Calculate relative interval as current time plusnumber of seconds given argv[2] */if (clock_gettime(CLOCK_REALTIME,ts.tv_sec += atoi(argv[2]);printf("main() about to call sem_timedwait()\n");while ((s = sem_timedwait(/* Restart if interrupted by handler *//* Check what happened */if (s == -1){if (errno == ETIMEDOUT)printf("sem_timedwait() timed out\n");elseperror("sem_timedwait");}else{printf("sem_timedwait() succeeded\n");}exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE);}【实例2】:
#include #include #include #include #include #include #include #include sem_t sem;void *func1(void *arg){sem_wait(int *running = (int *)arg;printf("thread func1 running : %d\n", *running);pthread_exit(NULL);}void *func2(void *arg){printf("thread func2 running.\n");sem_post(pthread_exit(NULL);}int main(void){int a = 3;sem_init(pthread_t thread_id[2];pthread_create(printf("main thread running.\n");sleep(10);pthread_create(printf("main thread still running.\n");pthread_join(thread_id[0], NULL);pthread_join(thread_id[1], NULL);sem_destroy(return 0;}
推荐阅读
-
[中金网]777家上市公司拟派发7941亿元“红包”现金分红比例呈逐年上升态势
-
小芳养生解说|幼儿视力麻烦多,孩子视力篇:电子产品齐扎堆
-
-
女性|面试需填生育计划被指歧视女性 泡泡玛特致歉:个别公司未按要求调整
-
新华网|美国种族“至暗史”之一:印第安人“悲歌”不绝
-
-
借得梅花一缕魂?赏析偷来梨蕊三分白,借得梅花一缕魂
-
[青椒来说娱乐]男明星为她疯狂,孙红雷半夜发微博未免太激动,青你2实名制出圈
-
废宅小编|古力娜扎占一部,最后一部直到女主牺牲才知道,“分不清女主女配”的5部剧
-
-
『体育大亨』美容养生、延缓衰老,早吃早受益!,女性可以多吃3种食物
-
抖音■A股疯狂警报拉响,周四或将上演十五年前的一幕!
-
永仁说历史|民间胡乱说,倒是英国人说清楚了,秦始皇的父亲是谁?司马迁不敢说
-
#垃圾分类#互联网+垃圾分类,朝阳这个村庄变净变美
-
-
-
辽沈晚报阜新时刻|副区长高云美洽谈智慧城市5G基站建设项目
-
伊能静|伊能静:54岁还没活明白!太作,是因为内心缺乏安全感
-
松达CBME优品周云配对,赋能渠道助力后疫情时代新增长
-
新机发布世界最小安卓10手机Jelly 2发布,屏幕仅3英寸