thread-pool icon indicating copy to clipboard operation
thread-pool copied to clipboard

Author of another thread pool says mtrebi's thread pool fails tests

Open Yzrsah opened this issue 7 years ago • 12 comments

From: https://github.com/Fdhvdu/ThreadPool/tree/master/comparison

First, I will not compare nbsdx, philipphenkel, tghosgor and mtrebi. Because their works has potential bug.

In the mtrebi test directory: https://github.com/Fdhvdu/ThreadPool/tree/master/comparison/mtrebi

Warning Do not use this. It gets stuck when runing out_100 sometimes.

Yzrsah avatar Dec 19 '18 14:12 Yzrsah

Hey,

Thanks for notifying me. I had no idea someone performed tests on my thread pool and it failed. I actually never thought someone would use this. I did this project to learn how threads worked and never expected someone to use it in a professional environment. I did everything for learning purposes.

Nowadays, I am really busy with my current job but I keep this in mind and I'll try to fix it in the future.

Thanks,

Mariano.

mtrebi avatar Dec 30 '18 17:12 mtrebi

Looks like there is deadlock which cause cpu to go 0 and app freezes.

jwang01 avatar Jan 14 '19 05:01 jwang01

Deadlock can occurs due to race/spurious wakeup.

yvoinov avatar Jan 14 '19 12:01 yvoinov

It seems that it is missing the lockguard/unique_lock in two places: m_conditional_lock.notify_all() and m_conditional_lock.notify_one()

jwang01 avatar Jan 14 '19 17:01 jwang01

It doesn't work that way. To protect against spurious wakeup, you should do something like this: https://github.com/yvoinov/thread-pool-cpp/blob/thread-pool-cpp-round-robin-stealing/include/thread_pool/worker.hpp. Mutexes do not play here. (If we're really have spurious wakeup case here.)

yvoinov avatar Jan 14 '19 17:01 yvoinov

The code seems a bit complicated. What's spurious wakeup case, do you mind elaborating a little bit on it? https://stackoverflow.com/questions/17101922/do-i-have-to-acquire-lock-before-calling-condition-variable-notify-one also: https://thispointer.com/c11-multithreading-part-7-condition-variables-explained/

jwang01 avatar Jan 14 '19 17:01 jwang01

https://stackoverflow.com/questions/17101922/do-i-have-to-acquire-lock-before-calling-condition-variable-notify-one

This about different thing. Of course, you always can make your own tests to prove your own theory :)

yvoinov avatar Jan 14 '19 17:01 yvoinov

You can also refer to this example: https://github.com/vit-vit/ctpl, which is working, but a bit slower.

jwang01 avatar Jan 14 '19 17:01 jwang01

I can cite a bunch of links proving that there is no need to block the notification of conditional variables. But I will not. :) You can continue to stay with your own delusions. :) But I advise you to better examine the issue of spurious wakeup.

yvoinov avatar Jan 14 '19 17:01 yvoinov

In addition: Mutexes is not slow. Slow only lock contention. So, think more, does you really want to slow down thread pool.

yvoinov avatar Jan 14 '19 17:01 yvoinov

It looks to me the bug is in line 32: m_pool->m_conditional_lock.wait(lock); Here it needs to check certain condition is met or not to tell whether it is spurious wake up or not.

m_pool->m_conditional_lock.wait(lock, [this]{return ! m_pool->m_queue.empty();});

jwang01 avatar Feb 23 '19 04:02 jwang01

It looks to me the bug is in line 32: m_pool->m_conditional_lock.wait(lock); Here it needs to check certain condition is met or not to tell whether it is spurious wake up or not.

m_pool->m_conditional_lock.wait(lock, [this]{return ! m_pool->m_queue.empty();});

I think you right, you can set up cpu core to thread to avoid that, or trying to wait_for certain time

C8LUKA avatar Apr 26 '21 06:04 C8LUKA