LINUX.ORG.RU

IPC question


0

1

Привет.
Есть приложение X, которое трогать нельзя. Приложение Х дёргает в разных потоках 3 библиотеки A, B и С. Каждая из библиотек использует один общий ресурс. Как правильно наладить взаимодействие в этом случае?

★★★★★
Ответ на: комментарий от Deleted

Ну до этого-то я и сам додумался, вопрос собственно в том, как получить мьютекс из библиотеки A в библиотеке B?

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

По видимому можно. Назревает вопрос, как избежать race condition при инициализации shared memory и запрашивании «если ли в ней mutex»?

UVV ★★★★★
() автор топика

Открыть некий файл с флагами O_CREAT|O_EXCL. Только один поток может сделать это в один момент времени.

Absurd ★★★
()

>Приложение Х дёргает в разных потоках 3 библиотеки A, B и С.

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

ttnl ★★★★★
()
Ответ на: комментарий от ttnl

> Зачем выдумывать IPC, если у тебя они работают на общей памяти. Библиотеки тоже твои.
Кто они?
Разные библиотеки: A, B и C.
Я могу модифицировать только их.

UVV ★★★★★
() автор топика

Приложение Х дёргает в разных потоках 3 библиотеки A, B и С.

потоках

библиотеки

Простите, а где здесь IPC?

baverman ★★★
()
Ответ на: комментарий от UVV

Кто они? Разные библиотеки: A, B и C. Я могу модифицировать только их.

Ну так модифицируй. В одной из библиотек при её инициализации создаешь мьютекс. Потом все его используют.

Создавать так(пример с main, скомпилируй, все сразу станет понятно):

void __my_init() __attribute__((constructor));
void __my_init()
{
        printf ("Prehello, world...\n");
}
int main()
{
        printf ("Hello, world!\n");
}
ttnl ★★★★★
()
Ответ на: комментарий от baverman

потоках или процессах, должно работать и так и так. По идее разница небольшая.

UVV ★★★★★
() автор топика

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

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

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

>А как получить этот мьютекс в другой библиотеке?

Если есть одна базовая библиотека, без которой две другие не используются, то помещаешь в нее как переменную, в остальных имеешь доступ через extern mutex *my_mutex.

Или у тебя три независимые библотеки?

ttnl ★★★★★
()
Ответ на: комментарий от UVV

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ttnl

> Или у тебя три независимые библотеки?
Именно так, я нигде не говорил, что одна зависит от другой. Просто они использую один общий ресурс, для которого и надо сделать синхронизацию.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

зачем mutex? используй semaphores. и проще и lock-file, как тут предлоголи не нужен.

beastie ★★★★★
()
Ответ на: комментарий от UVV

>Просто они использую один общий ресурс, для которого и надо сделать синхронизацию.

Что за ресурс, почему нельзя прилепить мютекс к нему?

ttnl ★★★★★
()
Ответ на: комментарий от UVV

Ресурс зовётся принтер ;)

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

A, B, C работают через него.

baverman ★★★
()
Ответ на: комментарий от UVV

>К нему мьютекс не хочет лепиться =)

Скотч уже пробовал? :)

ttnl ★★★★★
()
Ответ на: комментарий от UVV

> Ресурс зовётся принтер ;)

К нему мьютекс не хочет лепиться =)


а чем не подходит «мьютекс» по имени cups ?

x905 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.