Flertrådad enläsare enskrivare fifo-kö

Flertrådad enläsare enskrivare fifo-kö


Jag behöver en kö för att skicka meddelanden från en tråd (A) till en annan (B), men jag har inte kunnat hitta en som verkligen gör vad jag vill, eftersom de vanligtvis tillåter att lägga till ett objekt misslyckas, ett fall som i min situation är ganska ödesdigert eftersom meddelandet måste bearbetas och tråden verkligen inte kan stanna och vänta på ledigt rum.



  • Endast tråd A lägger till objekt, och bara tråd B läser dem

  • Tråd A får aldrig blockera, men tråd B är inte prestandakritisk, så det kan den

  • Att lägga till objekt måste alltid lyckas, så kön kan inte ha en övre storleksgräns (kort om att få slut på minne i systemet)

  • Om kön är tom bör tråd B vänta tills det finns ett objekt att bearbeta


Några kodsvar


Writer:
allocate message and fill it in
acquire lock
append node to intrusive list
signal condition variable
release lock Reader:
for(;;)
acquire lock for(;;)
if there's a node
remove it
break
else
wait on condition variable
endif endfor
release lock
process message
free message
endfor
#include <agents.h>
#include <ppl.h>
#include <iostream>
using namespace ::Concurrency;
using namespace ::std;
int main() { //to hold our messages, the buffer is unbounded... unbounded_buffer<int>
buf1;
task_group tasks;
//thread 1 sends messages to the unbounded_buffer //without blocking tasks.run([&buf1](){
for(int i = 0 ;
i <
10000;
++i)
send(&buf1,i)
//signal exit
send(&buf1,-1);
});
//thread 2 receives messages and blocks if there are none
tasks.run([&buf1](){
int result;
while(result = receive(&buf1)!=-1)
{cout <<
"I got a " <<
result <<
endl;
} });
//wait for the threads to end tasks.wait();
}