What is the best behavior for Consumers when queue is empty in Producer Consumer model





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I implement Producer Consumer model. When queue is empty consumers should wait and check queue again. At first i implements it as Thread.Sleep(0) and it is work fast. I change it to use ManualResetEvent. When queue is empty consumers wait on _consumerEvent.WaitOne(). When Producer put element in queue it set ManualResetEvent. This solution is slower about 30. Can some body explain why?



var isPlaced = _producerConsumerQueue.Enqueue(work);
if (isPlaced)
{
_consumerEvent.Set();
break;
}

var isGetted = _producerConsumerQueue.TryDequeue(out work);
if (!isGetted)
{
// Wait of filling
_producerEvent.Set();

//Thread.Yield();
//Thread.Sleep(0);
_consumerEvent.WaitOne();
//Thread.SpinWait(1);
continue;
}









share|improve this question























  • what is 'fast' and what is 'slower about 30' ? Your code isn't really MVCE example so that doesn't help much. To take a bit of a stab in the dark I'd say you find the ManualResetEvent slower because that use's deep down OS kernel events I think. Where as Thread.Yield and Thread.Sleep(0) and such are 'spinning' which is more performant for short wait times I think. Have a go with ManualResetEventSlim as that first tries spnning, then goes into the kernel stuff

    – Dave
    Nov 23 '18 at 16:41













  • What is the implementation of _producerConsumerQueue? Why not use a BlockingCollection that already solves this for you?

    – Peter Bons
    Nov 23 '18 at 18:40











  • Dave, thank you, i will try ManualResetEventSlim

    – Stas
    Nov 26 '18 at 8:17











  • Peter Bons, _producerConsumerQueue is inheritor of ConcurrentQueue

    – Stas
    Nov 26 '18 at 8:19











  • @Dave I think i can give MVCE here , because all code of this project is about Producer-Consumer model. I can give link to this projet on GitHub. Look at the classes ProducerOfWork and ConsumerOfWork github.com/Stanislav121/study-and-experiments/tree/master/…

    – Stas
    Nov 26 '18 at 8:53




















0















I implement Producer Consumer model. When queue is empty consumers should wait and check queue again. At first i implements it as Thread.Sleep(0) and it is work fast. I change it to use ManualResetEvent. When queue is empty consumers wait on _consumerEvent.WaitOne(). When Producer put element in queue it set ManualResetEvent. This solution is slower about 30. Can some body explain why?



var isPlaced = _producerConsumerQueue.Enqueue(work);
if (isPlaced)
{
_consumerEvent.Set();
break;
}

var isGetted = _producerConsumerQueue.TryDequeue(out work);
if (!isGetted)
{
// Wait of filling
_producerEvent.Set();

//Thread.Yield();
//Thread.Sleep(0);
_consumerEvent.WaitOne();
//Thread.SpinWait(1);
continue;
}









share|improve this question























  • what is 'fast' and what is 'slower about 30' ? Your code isn't really MVCE example so that doesn't help much. To take a bit of a stab in the dark I'd say you find the ManualResetEvent slower because that use's deep down OS kernel events I think. Where as Thread.Yield and Thread.Sleep(0) and such are 'spinning' which is more performant for short wait times I think. Have a go with ManualResetEventSlim as that first tries spnning, then goes into the kernel stuff

    – Dave
    Nov 23 '18 at 16:41













  • What is the implementation of _producerConsumerQueue? Why not use a BlockingCollection that already solves this for you?

    – Peter Bons
    Nov 23 '18 at 18:40











  • Dave, thank you, i will try ManualResetEventSlim

    – Stas
    Nov 26 '18 at 8:17











  • Peter Bons, _producerConsumerQueue is inheritor of ConcurrentQueue

    – Stas
    Nov 26 '18 at 8:19











  • @Dave I think i can give MVCE here , because all code of this project is about Producer-Consumer model. I can give link to this projet on GitHub. Look at the classes ProducerOfWork and ConsumerOfWork github.com/Stanislav121/study-and-experiments/tree/master/…

    – Stas
    Nov 26 '18 at 8:53
















0












0








0








I implement Producer Consumer model. When queue is empty consumers should wait and check queue again. At first i implements it as Thread.Sleep(0) and it is work fast. I change it to use ManualResetEvent. When queue is empty consumers wait on _consumerEvent.WaitOne(). When Producer put element in queue it set ManualResetEvent. This solution is slower about 30. Can some body explain why?



var isPlaced = _producerConsumerQueue.Enqueue(work);
if (isPlaced)
{
_consumerEvent.Set();
break;
}

var isGetted = _producerConsumerQueue.TryDequeue(out work);
if (!isGetted)
{
// Wait of filling
_producerEvent.Set();

//Thread.Yield();
//Thread.Sleep(0);
_consumerEvent.WaitOne();
//Thread.SpinWait(1);
continue;
}









share|improve this question














I implement Producer Consumer model. When queue is empty consumers should wait and check queue again. At first i implements it as Thread.Sleep(0) and it is work fast. I change it to use ManualResetEvent. When queue is empty consumers wait on _consumerEvent.WaitOne(). When Producer put element in queue it set ManualResetEvent. This solution is slower about 30. Can some body explain why?



var isPlaced = _producerConsumerQueue.Enqueue(work);
if (isPlaced)
{
_consumerEvent.Set();
break;
}

var isGetted = _producerConsumerQueue.TryDequeue(out work);
if (!isGetted)
{
// Wait of filling
_producerEvent.Set();

//Thread.Yield();
//Thread.Sleep(0);
_consumerEvent.WaitOne();
//Thread.SpinWait(1);
continue;
}






c# multithreading producer-consumer






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 23 '18 at 16:09









StasStas

11




11













  • what is 'fast' and what is 'slower about 30' ? Your code isn't really MVCE example so that doesn't help much. To take a bit of a stab in the dark I'd say you find the ManualResetEvent slower because that use's deep down OS kernel events I think. Where as Thread.Yield and Thread.Sleep(0) and such are 'spinning' which is more performant for short wait times I think. Have a go with ManualResetEventSlim as that first tries spnning, then goes into the kernel stuff

    – Dave
    Nov 23 '18 at 16:41













  • What is the implementation of _producerConsumerQueue? Why not use a BlockingCollection that already solves this for you?

    – Peter Bons
    Nov 23 '18 at 18:40











  • Dave, thank you, i will try ManualResetEventSlim

    – Stas
    Nov 26 '18 at 8:17











  • Peter Bons, _producerConsumerQueue is inheritor of ConcurrentQueue

    – Stas
    Nov 26 '18 at 8:19











  • @Dave I think i can give MVCE here , because all code of this project is about Producer-Consumer model. I can give link to this projet on GitHub. Look at the classes ProducerOfWork and ConsumerOfWork github.com/Stanislav121/study-and-experiments/tree/master/…

    – Stas
    Nov 26 '18 at 8:53





















  • what is 'fast' and what is 'slower about 30' ? Your code isn't really MVCE example so that doesn't help much. To take a bit of a stab in the dark I'd say you find the ManualResetEvent slower because that use's deep down OS kernel events I think. Where as Thread.Yield and Thread.Sleep(0) and such are 'spinning' which is more performant for short wait times I think. Have a go with ManualResetEventSlim as that first tries spnning, then goes into the kernel stuff

    – Dave
    Nov 23 '18 at 16:41













  • What is the implementation of _producerConsumerQueue? Why not use a BlockingCollection that already solves this for you?

    – Peter Bons
    Nov 23 '18 at 18:40











  • Dave, thank you, i will try ManualResetEventSlim

    – Stas
    Nov 26 '18 at 8:17











  • Peter Bons, _producerConsumerQueue is inheritor of ConcurrentQueue

    – Stas
    Nov 26 '18 at 8:19











  • @Dave I think i can give MVCE here , because all code of this project is about Producer-Consumer model. I can give link to this projet on GitHub. Look at the classes ProducerOfWork and ConsumerOfWork github.com/Stanislav121/study-and-experiments/tree/master/…

    – Stas
    Nov 26 '18 at 8:53



















what is 'fast' and what is 'slower about 30' ? Your code isn't really MVCE example so that doesn't help much. To take a bit of a stab in the dark I'd say you find the ManualResetEvent slower because that use's deep down OS kernel events I think. Where as Thread.Yield and Thread.Sleep(0) and such are 'spinning' which is more performant for short wait times I think. Have a go with ManualResetEventSlim as that first tries spnning, then goes into the kernel stuff

– Dave
Nov 23 '18 at 16:41







what is 'fast' and what is 'slower about 30' ? Your code isn't really MVCE example so that doesn't help much. To take a bit of a stab in the dark I'd say you find the ManualResetEvent slower because that use's deep down OS kernel events I think. Where as Thread.Yield and Thread.Sleep(0) and such are 'spinning' which is more performant for short wait times I think. Have a go with ManualResetEventSlim as that first tries spnning, then goes into the kernel stuff

– Dave
Nov 23 '18 at 16:41















What is the implementation of _producerConsumerQueue? Why not use a BlockingCollection that already solves this for you?

– Peter Bons
Nov 23 '18 at 18:40





What is the implementation of _producerConsumerQueue? Why not use a BlockingCollection that already solves this for you?

– Peter Bons
Nov 23 '18 at 18:40













Dave, thank you, i will try ManualResetEventSlim

– Stas
Nov 26 '18 at 8:17





Dave, thank you, i will try ManualResetEventSlim

– Stas
Nov 26 '18 at 8:17













Peter Bons, _producerConsumerQueue is inheritor of ConcurrentQueue

– Stas
Nov 26 '18 at 8:19





Peter Bons, _producerConsumerQueue is inheritor of ConcurrentQueue

– Stas
Nov 26 '18 at 8:19













@Dave I think i can give MVCE here , because all code of this project is about Producer-Consumer model. I can give link to this projet on GitHub. Look at the classes ProducerOfWork and ConsumerOfWork github.com/Stanislav121/study-and-experiments/tree/master/…

– Stas
Nov 26 '18 at 8:53







@Dave I think i can give MVCE here , because all code of this project is about Producer-Consumer model. I can give link to this projet on GitHub. Look at the classes ProducerOfWork and ConsumerOfWork github.com/Stanislav121/study-and-experiments/tree/master/…

– Stas
Nov 26 '18 at 8:53














0






active

oldest

votes












Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53449878%2fwhat-is-the-best-behavior-for-consumers-when-queue-is-empty-in-producer-consumer%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53449878%2fwhat-is-the-best-behavior-for-consumers-when-queue-is-empty-in-producer-consumer%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Academy of Television Arts & Sciences

L'Équipe

1995 France bombings