Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Проблемы с синхронизацией


Автор: 4eJIoBekMoJIekyJIa 16.5.2008, 00:34
Всем привет.
Помогите пожалуйста придумать алгоритм синхронизации. Происходит следущее: есть главный процесс(сервер), на нем запущено n потоков, есть n побочных процессов(клиенты).Сервер устанавливает связь с клиентами через сокеты (каждый поток отвечает за связь с соответсвующим клиентом).
Протокол общения: Сервер посылает клиентам сообщения; Клиенты отвечают; Тому клиенту, чей ответ пришел раньше сервер вновь отсылается сообщение.

Моя проблема в том, что я не пойму как ответить только тому клиенту кто прислал сообщение раньше.

Автор: MAKCim 16.5.2008, 09:48
Код

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
static pthread_t thread;
static struct timeval last;
static int flags;
static int count;
...
/* получаем ответ клиента */
struct timeval current;
gettimeofday(&current, NULL);
pthread_mutex_lock(&mutex);
/* сравниваем current с last, если меньше, изменяем flags, thread, last */
if (!--count)
    pthread_cond_signal(&condition)
else 
    pthread_mutex_unlock(&mutex);

Автор: 4eJIoBekMoJIekyJIa 16.5.2008, 17:25
Не мог бы ты пояснить что в твоей реализации такое flags, thread и кто просыпается при отправлении  pthread_cond_signal(&condition), а то чтото я ничего не понял

Автор: MAKCim 16.5.2008, 18:27
Цитата(4eJIoBekMoJIekyJIa @  16.5.2008,  17:25 Найти цитируемый пост)
Не мог бы ты пояснить что в твоей реализации такое flags, thread и кто просыпается при отправлении  pthread_cond_signal(&condition), а то чтото я ничего не понял 

сервер устанавливает flags = 0, count = n и блокируется на условной переменной condition
каждый поток после получения ответа от клиента вызывает gettimeofday() и захватывает mutex
если flags == 0 или текущее время (current) < последнего сохраненного (last), установить flags = 1, last = current, thread = ID текущего потока
уменьшаем count на 1
если count == 0, сигналим серверу о том, что получен ответ от всех клиентов и thread содержит ID потока, получившего ответ первым
по thread сервер идентифицирует клиента и отсылает сообщение
если count > 0, освобождаем mutex
блокируем поток вызовом pause()

Автор: 4eJIoBekMoJIekyJIa 20.5.2008, 21:57
спс разобрался )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)