创建 3 个线程,每个线程都使用 semapore 进行单独的工作以进行同步。我该怎么做?
Posted
技术标签:
【中文标题】创建 3 个线程,每个线程都使用 semapore 进行单独的工作以进行同步。我该怎么做?【英文标题】:creating 3 threads and each doing individual work using semapore for synchronization. how can i do it? 【发布时间】:2022-01-11 01:03:50 【问题描述】:问题说 Thread1 需要输入 2 个数字。 Thread2 要求选择(添加/订阅)。 Thread3 执行计算,主线程打印结果。使用信号量进行同步。 如何划分线程,每个线程将执行不同的操作。我是新手,所以我很困惑。
【问题讨论】:
对于线程之间的同步,您可能希望使用互斥锁。见mtx_
函数@Thread support library
@Ted Lyngmo,一个 pthread.h 互斥锁不能由与锁定它的线程不同的线程解锁。 thread.h 互斥体是否相同?如果是这样,您也需要一个 cond var。但这是某种需要信号量的赋值,所以最好使用它。无论如何,信号量在这里都能很好地工作。
@ikegami 是的,我想可以旋转一个 lock-check_if_its_my_time_to_run-unlock 循环,但这会消耗 CPU,因此最好使用条件变量。 Raisa:标准条件变量的函数在同一页,命名为cnd_
@TedLyngmo ??如果使用信号量,则不需要任何锁检查。
@MartinJames 不,这是对 ikegami w.r.t 的回复。如果使用互斥体,则需要添加条件变量。它与信号量无关。
【参考方案1】:
我们的需求
线程 2 需要等待,直到线程 1 告诉它数据可用。 线程 3 需要等待,直到线程 2 告诉它数据可用。我们的工具
信号量有两种操作:
post:增加信号量的值。 wait:等到信号量的值为正值,然后递减它的值。我们还可以将其初始化为我们选择的值。
线程 2 需要等待线程 1 告诉它数据可用
线程 2 需要使用 wait,因为这是唯一等待的操作。并且它只会在信号量为非正数(零或负数)时等待,因此必须将信号量初始化为非正数。
线程 1 需要告诉线程 2 数据可用
由于线程 2 正在等待信号量变为正,我们可以将信号量初始化为 0,并且线程 1 可以使用 post 操作使其在唤醒线程 2 时变为正.
线程 2 和线程 3 之间的通信
这与线程 1 和线程 2 之间的通信相同。所以我们将以相同的方式使用第二个信号量。
【讨论】:
以上是关于创建 3 个线程,每个线程都使用 semapore 进行单独的工作以进行同步。我该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章