如何用pthread获取信号量的信息

时间:2013-11-15 15:41:36

标签: c++ linux multithreading pthreads

我使用pthread.h和semaphore.h编写了一个程序

我发现semaphore.h中只有很少的函数如下:

int  sem_close(sem_t *);
int  sem_destroy(sem_t *);
int  sem_getvalue(sem_t * __restrict, int * __restrict);
int  sem_init(sem_t *, int, unsigned int);
sem_t*sem_open(const char *, int, ...);
int  sem_post(sem_t *);
int  sem_timedwait(sem_t * __restrict, const struct timespec * __restrict);
int  sem_trywait(sem_t *);
int  sem_unlink(const char *);
int  sem_wait(sem_t *);

我想知道,哪个线程将获得信号量以及该线程将获得多少个信号量?怎么做?我能这样做吗?

PS:这里“get”意味着,线程调用函数“sem_wait”来减少信号量的值

如果我无法获取信号量的信息,是否有任何机制可以确保一个线程只能获得一个信号量? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

sem_getvalue会告诉你信号量的值;知道它的初始值意味着你可以确定有多少进程“获得”信号量。但是,当你得到它时,你得到的价值可能是陈旧的。

由于线程完成了所有“获取”和释放,因此它可以确定自己“获取”了多少,并且如果有必要,可以将该信息提供给其他线程。

至于保证每个线程只“获取”一个信号量,我认为你必须编写你的代码,如果已经“拥有”一个信号,则不要求另一个信号量。

答案 1 :(得分:0)

如果我正确理解您的问题,只需在获取信号量的线程上使用pthread_self()函数即可获取其ID。如果您需要其他线程知道信号量的所有权信息,您可以设置一个简单的数据结构,如数组或哈希表等,以跟踪哪个线程持有哪个信号量。为了避免更新表的问题,请确保只有持有信号量的线程能够写入所持有的信号量的所有权表,并且所有其他不保存信号量的线程都只是允许从表中读取。