2010-10-19 3 views
0

У меня есть два семафора x (изначально на 1) и y (первоначально на 0).Семафор Синхронизация

Мой нить код функции несколько, как это:

... 

wait(x); 
    //setting some vars 
signal(x); 

wait(y); 

... 

Я хочу, чтобы гарантировать, что нити ждать y в строке, то есть. если первая нить завершила первый этап защиты x, сначала нужно подождать y, & и так далее. В текущей реализации контекстный коммутатор, возникший после signal(x);, может помешать этому.

Есть ли способ сделать это, или мне нужно полностью перестроить код, чтобы предотвратить это событие?

ответ

1

К сожалению, семафоры и все другие инструменты блокировки POSIX не позволяют устанавливать приоритеты или аналогично регулировать порядок их получения. (Это не ошибка, а функция.)

Самый простой способ выполнить задачу, которую вы хотите, - защитить переменную состояния с помощью pthread_mutex_t и соответствующего pthread_cond_t. В переменной состояния вы можете реализовать простую временную метку, чтобы отслеживать порядок, в котором потоки проходили через защищенный раздел. Что-то вроде

struct state { 
pthread_mutex_t mutex; 
pthread_cond_t cond; 
size_t seen_at_x; 
size_t seen_at_y; 
}; 
0

Если это важно для вас, то вам действительно нужно перестроить код.

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

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

0

Я не знаю, будет ли это работать! он не позволяет отменить синхронизацию потоков/asynch, но я не знаю, работает ли она для контекстного переключения между потоками. попробуйте положить:

pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL) 

и после последней строки, когда вы сделали с ним:

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL) 
Смежные вопросы