Синхронизация семафоров - PullRequest
0 голосов
/ 19 октября 2010

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

Мой код функции потока выглядит примерно так:

...

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

wait(y);

...

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

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

Ответы [ 3 ]

1 голос
/ 19 октября 2010

К сожалению, семафоры и все другие инструменты блокировки 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 голосов
/ 19 октября 2010

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

pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL)

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

pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL)
0 голосов
/ 19 октября 2010

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

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

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

...