Синхронизация между двумя потоками в Linux pthreads - PullRequest
3 голосов
/ 26 января 2010

Как в Linux можно синхронизировать 2 потока (используя pthreads в Linux)? Я хотел бы, чтобы при некоторых условиях поток блокировался сам, а затем позже он возобновлялся другим потоком. В Java есть функции wait (), notify (). Я ищу что-то такое же в pthreads:

Я прочитал это, но у него есть только мьютекс, который похож на ключевое слово Java для синхронизации. Это не то, что я ищу. https://computing.llnl.gov/tutorials/pthreads/#Mutexes

Спасибо.

Ответы [ 2 ]

10 голосов
/ 26 января 2010

Вам нужен мьютекс, переменная условия и вспомогательная переменная.

в теме 1:

pthread_mutex_lock(&mtx);

// We wait for helper to change (which is the true indication we are
// ready) and use a condition variable so we can do this efficiently.
while (helper == 0)
{
    pthread_cond_wait(&cv, &mtx);
}

pthread_mutex_unlock(&mtx);

в теме 2:

pthread_mutex_lock(&mtx);

helper = 1;
pthread_cond_signal(&cv);

pthread_mutex_unlock(&mtx);

Причина, по которой вам нужна вспомогательная переменная, заключается в том, что условные переменные могут пострадать от ложного пробуждения . Это комбинация вспомогательной переменной и условной переменной, которая дает вам точную семантику и эффективное ожидание.

0 голосов
/ 09 ноября 2010

Вы также можете посмотреть на спин блокировки. попробуйте man / google pthread_spin_init, pthread_spin_lock как отправную точку

в зависимости от вашего приложения, они могут быть более подходящими, чем мьютекс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...