学而不思则罔,思而不学则殆

有其事必有其理, 有其理必有其事

  IT博客 :: 首页 :: 联系 :: 聚合  :: 管理
  85 Posts :: 12 Stories :: 47 Comments :: 0 Trackbacks
///////////////////////////////////////////////////////
// int sem_timedwait(sem_t *restrict sem,
//              const struct timespec *restrict abs_timeout); //
//

/////////////////////////////////////////////////////
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>

int main() {
sem_t mysemp;
struct timespec ts;
int sts, val;


if ( sem_init (&mysemp, 0, 0) == -1 ) {
perror("sem_init is err");
return P-1;
}

ts.tv_sec=time(NULL)+1; // 重点
ts.tv_nsec=0;

/* Try to lock Semaphore */
sts = sem_timedwait(&mysemp, &ts);

....
 	sem_destroy(&mysemp);
}

posted on 2007-12-03 10:07 易道 阅读(12199) 评论(2)  编辑 收藏 引用

Feedback

# re: sem_timedwait() 简单用法 2011-06-14 11:48 sem_timedwait
您好,我在用sem_wait时直接报参数错,但是传入的sem_t在sem_init时并没有出错,ps我初始化sem_t第三个参数是0,如果用非零或者在sem_wait前调用sem_post那么sem_wait就正常返回,请问这是什么原因呢。邮箱gsqcool@126.com,烦请回复,谢谢!  回复  更多评论
  

# re: sem_timedwait() 简单用法[未登录] 2011-11-26 03:59 Andy
@sem_timedwait

sem_wait() 正常返回的前提是semaphore的值大于0。

sem_init()的第三个参数为semaphore的初始值,非零则sem_wait()可正常返回;sem_post()的执行结果为semaphore值递增1,sem_post()返回后semaphore值非零,sem_wait()可正常返回。

sem_wait()属于blocking call,如果semaphore值为零,sem_wait()将挂起并组织caller继续执行下个语句直到sem_post()更改semaphore值。所以你看到的并不能说不是“正常返回”,而是程序进程或线程执行挂起,这个现象正是semaphore正确执行的反应。  回复  更多评论
  

只有注册用户登录后才能发表评论。