创建 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 进行单独的工作以进行同步。我该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

互斥锁不在一个线程内引发的问题

java 线程池总结

一个电脑最多能开启多少个线程

线程池newScheduledThreadPool使用

Python 学习笔记 - 线程

iOS多线程简介