如何安排这个多线程应用程序?

时间:2011-11-15 06:26:54

标签: c++ c linux multithreading operating-system

让我们举例..

一些复杂的工作除以4线程

thread -A is calling function_A
thread -B is calling function_B
thread -C is calling function_C
thread -D is calling function_D

现在条件是线程A,B,C可以同时工作但是当线程D正在执行function_D时,它会看到来自A,B,C的任何线程是否正在执行那里的函数?如果是,那么它将等待它们完成,当没有来自a,b,c的线程执行该函数时,线程D将开始执行函数D.

我该怎么做?任何粗鲁的想法?

编辑:function_A,function_B,function_c正在使用一个句柄。和function_D正在关闭该句柄。当任何函数使用该句柄时,不应该通过function_d关闭。

3 个答案:

答案 0 :(得分:7)

这听起来像计数信号量的工作。

使用句柄的每个线程都应该增加信号量值。线程D应该等待信号量到达零。

如果你在没有关注线程D的情况下实现这一点,如果线程D在A,B或C之前运行并立即关闭手柄,不要感到惊讶。

答案 1 :(得分:3)

您需要自己同步这些线程,操作系统不会保证任何同步 最简单的方法是使用 Semaphores 或条件变量。

答案 2 :(得分:3)

您应该查看有关同步控制的信息。

取决于您的设计,可以有很多方法来实现这种行为:

  1. 线程A-C在运行之前获取自己的互斥锁/临界区,线程D在运行之前获取所有互斥锁。

  2. 计数信号量为3.线程A-C获取信号量一次,而线程D获取该信号量3次

  3. 利用读写器锁定,线程A-C获取读取器锁定,而线程D获取写入器锁定

  4. 等...

    所有这一切都取决于您的设计,而您是唯一知道哪种策略在您的设计中最合理的人。