как синхронизировать различное количество потоков? - PullRequest
1 голос
/ 07 декабря 2009

Может кто-нибудь помочь мне с синхронизацией различного количества потоков? Проблема в том, что количество потоков может варьироваться от одного до 9, и когда, например, два клиента подключены к серверу, связь должна быть синхронизирована в такой форме: client1, client2, client1, client2 ... до тех пор, пока связь не будет завершена. Я пытался с pthread_join, pthread_mutex_lock и pthread_mutex_lock, но это блокирует client1 до тех пор, пока не закончится связь для запуска client2.

Любая помощь будет оценена и спасибо за ваш ответ

Ответы [ 2 ]

2 голосов
/ 07 декабря 2009

Я на самом деле не очень хорошо понимаю, как следует синхронизировать потоки. Если есть какой-то блок кода, который должен быть выполнен сериализованным способом, тогда pthread_mutex_lock должен быть достаточно хорошим. Если порядок операций должен быть сохранен (1,2,3,1,2,3), я предлагаю использовать pthread_mutex_lock вместе с некоторой переменной, указывающей, какой поток может войти в критическую секцию сейчас.

// id_to_go iterates from 0 up to number_of_thread - 1
// each thread has my_id from the same range
while(1)
{
  pthread_mutex_lock(mutex);
  if (id_to_go == my_id)
  {
    // set to next thread id 
    id_to_go = (id_to_go + 1) % number_of_threads;
  }
  else
  {
    // it's not our turn, try again
    pthread_mutex_unlock(mutex);
    continue;
  }

  handle_the_client;
  pthread_mutex_unlock(mutex);
}
1 голос
/ 07 декабря 2009

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

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