Click here to Skip to main content
15,886,038 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
GeneralRe: Access a shared folder form server to client by giving usename ,password in program Pin
ranjithgoud18-Sep-09 2:44
ranjithgoud18-Sep-09 2:44 
AnswerRe: Access a shared folder form server to client by giving usename ,password in program Pin
David Crow18-Sep-09 4:15
David Crow18-Sep-09 4:15 
Questionbitblt prob Pin
Game-point16-Sep-09 21:14
Game-point16-Sep-09 21:14 
AnswerRe: bitblt prob Pin
CPallini16-Sep-09 21:46
mveCPallini16-Sep-09 21:46 
GeneralRe: bitblt prob Pin
Game-point16-Sep-09 22:04
Game-point16-Sep-09 22:04 
GeneralRe: bitblt prob Pin
Nuri Ismail16-Sep-09 22:11
Nuri Ismail16-Sep-09 22:11 
GeneralRe: bitblt prob Pin
CPallini16-Sep-09 22:12
mveCPallini16-Sep-09 22:12 
QuestionHow to get threads in a custom threadpool to not require locks when enabling/disabling threads? Pin
Cyrilix16-Sep-09 21:00
Cyrilix16-Sep-09 21:00 
The problem with my custom threadpool (fun activity, not commercial) is this:

I have, say 5 threads running, a global counter of how many pieces of work there are, and a work event which should be unsignaled (reset) when there is no work, and signaled (set) when there is work, because when there is no work, the threads simply wait on this event. I have two methods PushWork() and PopWork(). PushWork() increments the global counter by 1 using an interlocked operation, and checks "if I just incremented the global counter to 1, SetEvent()". PopWork() decrements the global counter by 1 using an interlocked operation, and checks "if I just decremented the global counter to 0, ResetEvent() and wait on the event".

The problem is a race condition. Imagine if the work queue is currently empty.

PushWork() gets called, and increments the counter to 1.
Then, PopWork() gets called and decrements the counter to 0.
PopWork(), running faster than PushWork() (for whatever reason) resets the event.
PushWork(), chugging along, then sets the event.

Now, we have a no more work in the queue, but the event is set, so the threads keep polling the queue for work. There is a similar problem for the other way around. Imagine if the work queue currently has one item.

PopWork() gets called, and decrements the counter to 0.
Then, PushWork() gets called and increments the counter to 1.
PushWork() sets the event.
PopWork() resets the event.

Now, there are work items in the queue, but the threads will stop running as soon as it hits the event.

The reason why this can occur is because modifying the counter and setting/resetting the event are not atomic. I could simply wrap both of these with a critical section, but I think the overhead is too big, since it means that for every piece of work, there are two EnterCriticalSection() calls and two LeaveCriticalSection() calls, one for each of push and pop. I've been trying to find a way to do this without locks. Does anyone have any ideas?

INFO: I use a combination of global work queues and local work queues (one per thread) as per modern threadpooling implementations with work-stealing queues. I do, however, have one global counter for all the work. I've entertained the idea of using different counters but don't see how that would solve my problem.
AnswerRe: How to get threads in a custom threadpool to not require locks when enabling/disabling threads? Pin
Stuart Dootson16-Sep-09 21:24
professionalStuart Dootson16-Sep-09 21:24 
GeneralRe: How to get threads in a custom threadpool to not require locks when enabling/disabling threads? Pin
Cyrilix17-Sep-09 6:25
Cyrilix17-Sep-09 6:25 
GeneralRe: How to get threads in a custom threadpool to not require locks when enabling/disabling threads? Pin
Stuart Dootson17-Sep-09 6:53
professionalStuart Dootson17-Sep-09 6:53 
AnswerRe: How to get threads in a custom threadpool to not require locks when enabling/disabling threads? Pin
Randor 17-Sep-09 7:31
professional Randor 17-Sep-09 7:31 
GeneralRe: How to get threads in a custom threadpool to not require locks when enabling/disabling threads? Pin
Cyrilix17-Sep-09 7:53
Cyrilix17-Sep-09 7:53 
QuestionWeb Filter Pin
Aseem Sharma16-Sep-09 17:44
Aseem Sharma16-Sep-09 17:44 
AnswerRe: Web Filter Pin
N a v a n e e t h16-Sep-09 18:38
N a v a n e e t h16-Sep-09 18:38 
QuestionClass or Library to support MFC Document Windows borders Pin
WylieCoyoteUsa16-Sep-09 17:21
WylieCoyoteUsa16-Sep-09 17:21 
QuestionRe: Class or Library to support MFC Document Windows borders Pin
CPallini16-Sep-09 21:06
mveCPallini16-Sep-09 21:06 
AnswerRe: Class or Library to support MFC Document Windows borders Pin
WylieCoyoteUsa17-Sep-09 2:58
WylieCoyoteUsa17-Sep-09 2:58 
QuestionPassing Objects UI threads VS worker threads Pin
ForNow16-Sep-09 14:57
ForNow16-Sep-09 14:57 
AnswerRe: Passing Objects UI threads VS worker threads Pin
Chris Losinger16-Sep-09 16:03
professionalChris Losinger16-Sep-09 16:03 
GeneralRe: Passing Objects UI threads VS worker threads Pin
ForNow16-Sep-09 16:31
ForNow16-Sep-09 16:31 
QuestionRecursive maze, so close, probably something stupid Pin
forensicgeek16-Sep-09 14:17
forensicgeek16-Sep-09 14:17 
AnswerRe: Recursive maze, so close, probably something stupid Pin
«_Superman_»16-Sep-09 20:17
professional«_Superman_»16-Sep-09 20:17 
AnswerRe: Recursive maze, so close, probably something stupid Pin
David Crow17-Sep-09 2:43
David Crow17-Sep-09 2:43 
AnswerRe: Recursive maze, so close, probably something stupid Pin
Alan Balkany18-Sep-09 3:58
Alan Balkany18-Sep-09 3:58 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.