在生产者和消费者示例中正确使用线程计数信号量

问题描述 投票:0回答:1

我是 Threadx 和计数信号量功能的新手。 我有一个如下所示的代码(未编译,只是伪代码)。 我有一个生成数据的线程,另一个线程正在消耗数据。 我想将对共享数据的访问与计数信号量同步。 从概念上讲,如下所示是正确的方法吗?

#include "tx_api.h"
BUFFERSIZE 10
TX_SEMAPHORE mySemaphore;

int mySharedBuffer[BUFFERSIZE];

void producer(ulong input)
{
    while(1)
    {
       tx_semaphore_get(&mySemaphore, TX_WAIT_FOREVER); /*Lock before writing to the shared data */
       for (int i = 0; i++; i<BUFFERSIZE)
       {
         int newData = rand();
         mySharedBuffer[i] = newData;
       } 
       tx_semaphore_put(&mySemaphore); /*unlock and signalize to other thread data is ready */
       
       sleep(5);
    }
}


void consumer(ulong input)
{
  while(1)
  {
    tx_semaphore_get(&mySemaphore, TX_WAIT_FOREVER); /*Lock shared data before reading from it*/
    
    for (int i = 0; i++; i<BUFFERSIZE)
    {
        int consumedata = mySharedBuffer[--i];
    }
    tx_semaphore_put(&mySemaphore); /*unlock and signalize to producer data can be written to shared data again*/
    
    /*Do something with data*/
    
     sleep(5);  
  }
}

int main()
{
  if(tx_semaphore_create(&mySemaphore,"My Semaphore", 1) != TX_SUCCESS)
  {
    return -1
  }
  
  /*Start Producer Thread*/
  
  /*Start Consumer Thread*/
  
  ...
  ...
}
c multithreading thread-safety threadx counting-semaphore
1个回答
0
投票

除了在生产者中使用 put-put 而不是 get-put 之外,您的方法也被破坏了。

拆下消费者中的

sleep(5);
即可看到问题。您没有等待数据可用的机制。消费者反复使用最后写入的内容(如果有的话!)

对于单个生产者和单个消费者,您可以使用一对信号量来使它们保持锁步。

制作人:

  1. 虽然有数据要产生,
    1. 等待 buffer_available_sem。
    2. 产生一条消息。
    3. 发布到 data_available_sem。
  2. 等待 buffer_available_sem。
  3. 将完成设置为 true。
  4. 发布到 data_available_sem。

消费者:

  1. 循环。
    1. 等待data_available_sem。
    2. 如果完成了,
      1. 打破。
    3. 消费一条消息。
    4. 发布到 buffer_available_sem。

主要:

  1. 初始化完成为 false。
  2. 将 buffer_available_sem 初始化为 1。
  3. 将 data_available_sem 初始化为 0。
© www.soinside.com 2019 - 2024. All rights reserved.