【问题标题】:creating 3 threads and each doing individual work using semapore for synchronization. how can i do it?创建 3 个线程,每个线程都使用 semapore 进行单独的工作以进行同步。我该怎么做?
【发布时间】: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 的回复。如果使用互斥体,则需要添加条件变量。它与信号量无关。

标签: c multithreading semaphore


【解决方案1】:

我们的需求

  • 线程 2 需要等待,直到线程 1 告诉它数据可用。
  • 线程 3 需要等待,直到线程 2 告诉它数据可用。

我们的工具

信号量有两种操作:

  • post:增加信号量的值。
  • wait:等到信号量的值为正值,然后递减它的值。

我们还可以将其初始化为我们选择的值。

线程 2 需要等待线程 1 告诉它数据可用

线程 2 需要使用 wait,因为这是唯一等待的操作。并且它只会在信号量为非正数(零或负数)时等待,因此必须将信号量初始化为非正数。

线程 1 需要告诉线程 2 数据可用

由于线程 2 正在等待信号量变为正,我们可以将信号量初始化为 0,并且线程 1 可以使用 post 操作使其在唤醒线程 2 时变为正.

线程 2 和线程 3 之间的通信

这与线程 1 和线程 2 之间的通信相同。所以我们将以相同的方式使用第二个信号量。

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2023-03-27
    相关资源
    最近更新 更多