网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
struct timeval time;
gettimeofday(&time, NULL);
time_add_ms(&time, TIMEOUT_MS);
t.tv_sec = time.tv_sec;
t.tv_nsec = time.tv_usec * 1000;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 秒级别
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//t.tv_sec = time(NULL) + TIMEOUT_S;
//t.tv_nsec = 0;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
printf("t.tv_sec = %lu\n", t.tv_sec);
printf("t.tv_nsec = %lu\n", t.tv_nsec);
while(1)
{
int semvalue = -1;
sem_getvalue(&sem, &semvalue);
printf("will call sem_timedwait, semvalue = %d\n", semvalue);
// 如果sem 信号量值>0,则sem_timedwait 立即返回;如果sem 信号量值≤0,则 sem_timedwait 阻塞等待 TIMEOUT秒后再返回。
int ret = sem_timedwait(&sem, &t);
printf("over call sem_timedwait, ret = %d\n", ret);
if (ret == -1)
{
sem_getvalue(&sem, &semvalue);
printf("pthread() will return\n");
return NULL;
}
}
}
int main(void)
{
pthread_t tid;
sem_init(&sem, 0, 0); // 第3个参数是0,相当于此时停车场已经停满了,必须要等到有车离开时(即执行sem_post 操作)才能停车。
sem_post(&sem);
sem_wait(&sem);
sem_post(&sem);
pthread_create(&tid, NULL, &pthread, NULL);
pthread_join(tid, NULL);
sem_destroy(&sem);
return 0;
}
编译/执行
xj@ubuntu-server:~/semaphore$ gcc sem_timedwait.c -lpthread
xj@ubuntu-server:~/semaphore$ ./a.out
t.tv_sec = 1446627450
t.tv_nsec = 79247000
will call sem_timedwait, semvalue = 1
over call sem_timedwait, ret = 0
will call sem_timedwait, semvalue = 0
over call sem_timedwait, ret = -1
pthread() will return
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**