我是 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*/
...
...
}
除了在生产者中使用 put-put 而不是 get-put 之外,您的方法也被破坏了。
拆下消费者中的
sleep(5);
即可看到问题。您没有等待数据可用的机制。消费者反复使用最后写入的内容(如果有的话!)
对于单个生产者和单个消费者,您可以使用一对信号量来使它们保持锁步。
制作人:
消费者:
主要: