Multithreading 如何取消阻止等待信号量的所有线程?

Multithreading 如何取消阻止等待信号量的所有线程?,multithreading,deadlock,semaphore,producer-consumer,Multithreading,Deadlock,Semaphore,Producer Consumer,我正在处理有限数组(或有限多个缓冲区)的标准生产者和消费者问题。我尝试使用信号量实现它,但遇到了一个问题。我希望制作人只“制作”50次。之后,我希望生产者线程加入主线程。这一部分很简单,但我不能做的是加入消费者线程。他们被困在信号灯上,表示没有数据。我如何解决这个问题? 一个可能的选择是使用一个flag变量,当producer加入main时,该变量变为True,之后,主线程执行post(信号量)的次数将是工作线程数的两倍。工作线程在每次唤醒后都会检查flag变量,如果为True,它将退出函数。

我正在处理有限数组(或有限多个缓冲区)的标准生产者和消费者问题。我尝试使用信号量实现它,但遇到了一个问题。我希望制作人只“制作”50次。之后,我希望生产者线程加入主线程。这一部分很简单,但我不能做的是加入消费者线程。他们被困在信号灯上,表示没有数据。我如何解决这个问题?
一个可能的选择是使用一个flag变量,当producer加入main时,该变量变为True,之后,主线程执行post(信号量)的次数将是工作线程数的两倍。工作线程在每次唤醒后都会检查flag变量,如果为True,它将退出函数。
我认为我的方法效率很低,因为有很多post信号量调用。如果我能一次解锁所有线程,那就太好了!

编辑:我试着执行我所说的,并且由于死锁

< P>不起作用。我在FieltoOS操作系统中只做了C++的生产者-消费者结构,所以请记住这一点。到目前为止,这是我在多任务处理方面的唯一经验。我想说的是,我在那个节目中只使用了一个制作人和一个消费者。我在LabView中做过多任务处理,但我想这和你可能做的有点不同

我认为一种选择是使用队列结构,这样生产者可以将元素排到队列中,但是如果队列中充满数据,那么您可以很有希望地实现它,这样您就可以制定某种队列策略,如下所示

制片人可以

  • 阻塞自身,直到队列中有空间排队
  • 在特定的时间段内阻塞自身,如果花费了时间且数据排队失败,则继续在其他位置执行
  • 马上去别处
  • 看来你的排队策略已经准备好了

    至少在FreeRTOS中,队列读取器能够具有类似的三种策略

    一般来说,如果你有一个二进制信号量,那么你就有了它,这样发送方发送它,接收方等待它。它用于同步或发信号

    在我看来,您选择了“许多信号量”的错误方法(??) 您需要的是一个队列结构,生产者在其中输入内容。。。 然后,消费者从队列中读取他们必须执行的任何操作。。。 如果队列是空的,那么您需要一个关于队列读取器线程应该做什么的策略。 对于那些队列读取器和信号量读取器,在队列为空或尚未收到信号量的情况下,还需要选择策略。对于这种问题,我不会使用信号量

    我认为布尔变量的想法是可行的,因为您只在producer线程中写入该变量。如果生成器处于活动状态,则其他线程应该能够读取并轮询该布尔变量


    <>但是我认为你应该提供更多细节,你要做的事情,尤其是消费线程,你有多少种线程,你在编程什么语言等等……< /P> < P>我在FieltoOS操作系统中只做了C++的生产者-消费者结构,所以请记住这一点。到目前为止,这是我在多任务处理方面的唯一经验。我想说的是,我在那个节目中只使用了一个制作人和一个消费者。我在LabView中做过多任务处理,但我想这和你可能做的有点不同

    我认为一种选择是使用队列结构,这样生产者可以将元素排到队列中,但是如果队列中充满数据,那么您可以很有希望地实现它,这样您就可以制定某种队列策略,如下所示

    制片人可以

  • 阻塞自身,直到队列中有空间排队
  • 在特定的时间段内阻塞自身,如果花费了时间且数据排队失败,则继续在其他位置执行
  • 马上去别处
  • 看来你的排队策略已经准备好了

    至少在FreeRTOS中,队列读取器能够具有类似的三种策略

    一般来说,如果你有一个二进制信号量,那么你就有了它,这样发送方发送它,接收方等待它。它用于同步或发信号

    在我看来,您选择了“许多信号量”的错误方法(??) 您需要的是一个队列结构,生产者在其中输入内容。。。 然后,消费者从队列中读取他们必须执行的任何操作。。。 如果队列是空的,那么您需要一个关于队列读取器线程应该做什么的策略。 对于那些队列读取器和信号量读取器,在队列为空或尚未收到信号量的情况下,还需要选择策略。对于这种问题,我不会使用信号量

    我认为布尔变量的想法是可行的,因为您只在producer线程中写入该变量。如果生成器处于活动状态,则其他线程应该能够读取并轮询该布尔变量

    但是我认为你应该提供更多的细节,你正在尝试做什么,特别是消费线程,你有多少线程,你用什么样的语言编程等等。

    一个选项是“毒丸”方法。它假设您知道存在多少消费者线程。假设有N个消费者,那么在生产商完成它的事情之后,它将N个“毒丸”放入队列。“毒丸”只是一个对象/值,其类型与生产者通常生产的任何产品兼容,但与正常对象/值不同

    当消费者意识到自己吃了毒丸时,就会死亡。问题解决。

    一种选择是“毒丸”法。它假设你知道有多少缺点