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;
}
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
add a comment |
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
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
add a comment |
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
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
c# multithreading producer-consumer
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
add a comment |
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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