Ich versuche, ein Erzeuger/Verbraucher-Thread Situation effizienter durch Überspringen teure Veranstaltung Operationen, wenn nötig mit so etwas wie zu machen:Efficient Consumer-Thread mit mehreren Herstellern
//cas(variable, compare, set) is atomic compare and swap
//queue is already lock free
running = false
// dd item to queue – producer thread(s)
if(cas(running, false, true))
{
// We effectively obtained a lock on signalling the event
add_to_queue()
signal_event()
}
else
{
// Most of the time if things are busy we should not be signalling the event
add_to_queue()
if(cas(running, false, true))
signal_event()
}
...
// Process queue, single consumer thread
reset_event()
while(1)
{
wait_for_auto_reset_event() // Preferably IOCP
for(int i = 0; i < SpinCount; ++i)
process_queue()
cas(running, true, false)
if(queue_not_empty())
if(cas(running, false, true))
signal_event()
}
Offensichtlich versuchen, diese Dinge zu bekommen richtig ist ein wenig knifflig (!) also ist der obige Pseudocode korrekt? Eine Lösung, die das Ereignis mehr signalisiert, als genau benötigt wird, ist in Ordnung, aber nicht für jedes Element.
In welcher Sprache ist Ihr Code? – Marcel
Sind Event-Operationen nur teuer oder ist auch die Verarbeitung von Consumer-Threads teuer? (und das willst du auch vermeiden?) –
Sorry, ich habe gerade erst dieses Feedback bemerkt! Es ist in C++ obwohl ich daran interessiert bin ähnlich in CSharp zu replizieren. Eine Ereignissynchronisierungsoperation ist am teuersten, wenn sie für jedes Element in der Warteschlange ausgeführt wird. – iam