Search code examples
c++cmultithreadingperformanceatomic

fastest way to wake up a thread without using condition variable


I am trying to speed up a piece of code by having background threads already setup to solve one specific task. When it is time to solve my task I would like to wake up these threads, do the job and block them again waiting for the next task. The task is always the same.

I tried using condition variables (and mutex that need to go with them), but I ended up slowing my code down instead of speeding it up; mostly it happened because the calls to all needed functions are very expensive (pthread_cond_wait/pthread_cond_signal/pthread_mutex_lock/pthread_mutex_unlock).

There is no point in using a thread pool (that I don't have either) because it is a too generic construct; here I want to address only my specific task. Depending on the implementation I would also pay a performance penalty for the queue.

Do you have any suggestion for a quick wake-up without using mutex or con_var?

I was thinking in setup threads like timers reading an atomic variable; if the variable is set to 1 the threads will do the job; if it is set to 0 they will go to sleep for few microseconds (I would start with microsecond sleep since I would like to avoid using spinlocks that might be too expensive for the CPU). What do you think about it? Any suggestion is very appreciated.

I am using Linux, gcc, C and C++.


Solution

  • These functions should be fast. If they are taking a large fraction of your time, it is quite possible that you are trying to switch threads too often.

    Try buffering up a work queue, and send the signal once a significant amount of work has accumulated.

    If this is impossible due to dependencies between the tasks, then your application is not amenable to multithreading at all.