【问题标题】:Condition Vars at POSIXPOSIX 的条件变量
【发布时间】:2014-02-06 18:42:26
【问题描述】:

我正在为一个项目制作剧院预订申请。我的剧院有 10 个接线员,所以每次只有 10 个客户可以同时预订。当一个客户端完成后,另一个客户端与操作员连接。

我已建立服务器-客户端连接。每次出现新客户时,我都会创建一个新线程。现在我的问题是如何让 10 个线程同时进行操作。我知道我必须使用条件变量,但不知道具体如何。

每当客户连接时,我的想法是什么

lock mutex()
counter++;
if(counter > 10)
  block thread() until an operator is free
else
  do computations
unlock mutex()

我知道我必须使用 cond_signal 和 cond_wait,但我不知道具体如何。有什么帮助吗?

【问题讨论】:

  • 这里有一个提示:“阻塞线程”听起来像“等待条件变量”。您应该能够自己弄清楚“操作员是免费的”是什么意思。 (提示 2:如果其他线程释放了运算符,则运算符变为空闲。该线程可能应该发出条件变量的信号。)
  • P.S.:在现实世界中(即不是在家庭作业中),让 10 个固定线程代表 10 个操作员并让客户端由队列中的对象代表可能更有意义。

标签: c multithreading posix


【解决方案1】:

在调用线程之前:

sem_t *sem;
sem = (sem_t*)malloc(sizeof(sem_t));
sem_init(sem, 0, 10);

线程内部:

sem_wait(sem);

do computations
sem_post(sem);

sem_init 的最后一个参数是允许执行多少线程。 每次调用 sem_wait 时,该值都会减小,如果它变为

【讨论】:

  • 谢谢,但这是一个大学项目,在这部分我不允许使用信号量。我必须让它与互斥锁和条件变量一起工作。
  • 您可以使用互斥锁和条件变量实现自己的信号量。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多