Как синхронизировать процессы через статическую библиотеку в Linux? - PullRequest
1 голос
/ 06 сентября 2011

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

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

Теперь предположим, что я хочу использовать мьютексы pthread;как я могу этого достичь?Как процессы могут узнать, в какой области разделяемой памяти хранится мьютекс?А кому нужна эта область памяти?Сервер не может, потому что требуется, чтобы сама библиотека обеспечивала взаимное исключение.

Благодаря asveikau я придумал следующее:

#define SHARED 1
#define MUTEX 1

int main() {

    sem_t* mutex = sem_open("mutex", O_CREAT);

    sem_init(mutex, SHARED, MUTEX);

    fork(), fork(), fork();

    sem_wait(mutex);

    int i;
    for(i = 0; i < 10; i++)
        printf("process %d %d\n", getpid(), i), fflush(stdout);

    sem_post(mutex);
}

, что из вывода действительно решает мою проблему.

Спасибо всем.

1 Ответ

1 голос
/ 07 сентября 2011

Я записал это как комментарий, но думаю, что это стоит ответа.

Как утверждают другие, мьютексы pthread не являются кросс-процессными. Что вам нужно, так это «именованный мьютекс». Вы можете использовать sem_open, чтобы создать кросс-процессный семафор и дать ему начальный счет 1. В этом случае sem_wait становится «блокировкой мьютекса», а sem_post становится «разблокировкой мьютекса».

Обратите внимание, что sem_open, хотя и является частью POSIX, не поддерживается повсеместно. Я считаю, что это работает на Linux и Mac OS X. Вероятно, Solaris, если вы заботитесь об этом (в наши дни, вероятно, нет). Я знаю, что в OpenBSD всегда происходит сбой с ENOSYS. YMMV.

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