こんにちは、私は、マルチ セマフォで POSIX スレッドを使用することに関する割り当てに取り組んでいます。割り当ての簡単な説明は次のとおりです。4 つのさまざまなデータ パケット (char/video/audio/image) があり、それぞれが異なるスレッドによって運ばれ、共有バッファーもあります。システムで動作できる最大スレッド数は、ユーザーが入力として維持します。例えば; ユーザーが 10 を入力すると、最大 10 のスレッドが作成され、特定の時間内にバッファを介してデータ パケットが送信されます。今、私にとって紛らわしい部分は、このバッファには限られたパケットを即座に含めることができるということです。(たとえば、最大 10 個の char パケットと 20 個のビデオ パケットなどを含めることができます) そのため、データ タイプごとに異なるセマフォを用意する必要があります。問題は、非常に単純なセマフォでバッファサイズを制御する方法を知っていますが、パケットのセマフォを使用するという正しい考えを設定することはできません。私はいくつかの異なる方法を試しましたが、常にデッドロックエラーに直面していました。これが私のプログラムをより明確に理解するための私の擬似コードです。
define struct packege
define semaphore list
main
initialize variables and semaphores
while threadCounter is less than MaxThreadNumber
switch(random)
case 0: create a character package
create a thread to insert the package in buffer
case 1: create a video package
create a thread to insert the package in buffer
case 2: create an image package
create a thread to insert the package in buffer
case 3: create an audio package
create a thread to insert the package in buffer
increment threadCounter by one
end of while
create only one thread which will make the dequeue operation
end of main
producer function
for i->0 to size_of_package
sem_wait(empty_buffer) // decrement empty_buffer semaphore by size of package
lock_mutex
insert item into queueu
decrement counter of the buffer by size of package
unlock_mutex
for i->0 to size_of_package
sem_post(full_buffer) // increment full_buffer semaphore by size of package
end of producer function
consumer function
while TRUE // Loops forever
lock_mutex
if queue is not empty
dequeue
increment counter of the buffer size of package
unlock_mutex
for i->0 to size_of_package // The reason why i making the sem_wait operation here is i cant make the dequeue in outer region of mutex.
sem_wait(full_buffer)
for i->0 to size_of_package
sem_post(empty_buffer)
end of consumer function
この実装プログラムでは正しく動作します。しかし、パッケージのスレッドに属するセマフォを適切に使用できませんでした。私はすべての推奨事項を聞くことができ、すべての回答に感謝します。