【问题标题】:How to get the information of semaphore with pthread如何用pthread获取信号量的信息
【发布时间】:2013-11-29 01:36:50
【问题描述】:

我已经使用 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”来减少信号量的值

如果我无法获取信号量的信息,有没有什么机制可以保证一个线程只能获取一个信号量? 提前谢谢你。

【问题讨论】:

  • 线程“获取”信号量是什么意思?
  • 在线程中调用sem_wait并减小semaphore@ScottHunter的值
  • 对信号量强制执行的唯一操作是 P/V、发布和等待。
  • 我知道。这里的“get”表示线程调用函数 sem_wait@MartinJames
  • SysV 信号量(不是您正在使用的 posix 信号量)允许您查询哪个进程上次对信号量执行操作,因此如果最后一次操作发生在等待中,您可以获得该信息。问题应该是为什么需要它。如果是为了调试,一个简单的日志可以告诉你同样的事情。

标签: c++ linux multithreading pthreads


【解决方案1】:

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

【讨论】:

  • 跟踪线程和信号量,意思是使用条件变量?
【解决方案2】:

sem_getvalue 会告诉你信号量的值;知道它的初始值意味着您可以确定有多少进程“获得”了信号量。但是,您获得的价值可能在您获得时已经过时。

由于线程完成了所有的“获取”和释放,它可以确定自己“获取”了多少,并在必要时将这些信息提供给其他线程。

至于确保每个线程仅“获取”一个信号量,我认为您必须编写代码以不请求另一个信号量,如果它已经“拥有”一个信号量。

【讨论】:

  • 是的,怎么做?(如果它已经“有”一个信号量,则不要请求另一个信号量。)
  • 如果您的代码没有被卡住等待等待返回,它会拥有该信号量,直到它释放它,这一切都在您的控制之下。所以在你释放它之前,不要再请求另一个。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
相关资源
最近更新 更多