2019-01-11 19:12:36 +00:00
|
|
|
#include <Common/ThreadPool.h>
|
2016-09-26 10:15:33 +00:00
|
|
|
|
|
|
|
/** Reproduces bug in ThreadPool.
|
|
|
|
* It get stuck if we call 'wait' many times from many other threads simultaneously.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2017-12-01 18:36:55 +00:00
|
|
|
int main(int, char **)
|
2016-09-26 10:15:33 +00:00
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
auto worker = []
|
|
|
|
{
|
|
|
|
for (size_t i = 0; i < 100000000; ++i)
|
|
|
|
__asm__ volatile ("nop");
|
|
|
|
};
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
constexpr size_t num_threads = 4;
|
|
|
|
constexpr size_t num_jobs = 4;
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
ThreadPool pool(num_threads);
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
for (size_t i = 0; i < num_jobs; ++i)
|
|
|
|
pool.schedule(worker);
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
constexpr size_t num_waiting_threads = 4;
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
ThreadPool waiting_pool(num_waiting_threads);
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
for (size_t i = 0; i < num_waiting_threads; ++i)
|
|
|
|
waiting_pool.schedule([&pool]{ pool.wait(); });
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
waiting_pool.wait();
|
2016-09-26 10:15:33 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
return 0;
|
2016-09-26 10:15:33 +00:00
|
|
|
}
|