Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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++.

like image 275
Abruzzo Forte e Gentile Avatar asked Apr 08 '11 09:04

Abruzzo Forte e Gentile


1 Answers

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.

like image 115
Potatoswatter Avatar answered Oct 27 '22 18:10

Potatoswatter