Сигнально-семафорная система V - PullRequest
0 голосов
/ 20 октября 2019

Я программирую на Unix на C.

У меня есть 3 критические зоны:

Mutex1 -> Lock
{
{ ZONE1
{
Mutex1 -> unLock

Mutex2 -> Lock
{
{ ZONE2
{
Mutex2 -> unLock

Mutex3 -> Lock
{
{ ZONE3
{
Mutex3 -> unLock

Для каждой зоны есть мьютекс. N процессов выполняют этот код, поэтому для управления критическими областями требуются мьютексы. Моя проблема:

SIGINT обрабатывается таким образом -> сигнал (SIGINT, обработчик);

void handler(int sign)
{
    exit(0);
}

Если один процесс получает сигнал (например, Ctrl + C) в одном критическомобласть, в которой мне нужно разблокировать мьютекс, просто учитывая, где был процесс, когда он получил сигнал (зона 1, зона 2 или зона 3).

Что я могу сделать, чтобы сделать это?

1 Ответ

0 голосов
/ 20 октября 2019

Один из вариантов - блокировать сигналы вокруг критических секций с помощью sigprocmask () . Таким образом, вы можете ограничить отклик сигнала на некритические области.

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

volatile sigstate;

void handler(int signo) {
    if (sigstate & 1) {
          sigdefcount++;
    } else {
          _exit(1);
    }
}

Обратите внимание, что небезопасно вызывать exit () из обработчика сигнала;должно быть _exit () . При этом код в ваших критических разделах должен устанавливать флаг sigstate и периодически проверять счетчик. Это быстро усложняется, так как многие системные вызовы по умолчанию имеют тихий перезапуск при прерывании, и вам может потребоваться блокировка интерфейсов с тайм-аутами, чтобы вы могли проверить этот индикатор.

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

...