LINUX.ORG.RU

[C++] synchronious_call( func, args ) как сделать?

 


0

0

Надо сделать некую обёртку, чтобы передав в неё любой объект, адрес любого его метода и параметры метода, можно было бы вызвать этот самый метод объекта с этими самыми параметрами из нескольких разных потоков синхронизуясь через mutex, например.

Кто знает, где можно нечто подобное подглядеть?

Заранее спасибо за помощь.

Я примерно представляю, как это сделать в нашей программе, но надо бы проконсультироваться с кем-то ещё...


А в какой части проблемы? Вызвать функцию при таких аргументах?

> синхронизуясь через mutex, например.

ничегонипонял. где, что синхронизуясь?

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

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

Reset ★★★★★
()

Автор, ты хочешь таким образом избежать втыкивания мютексов во все методы всех объектов? А ты учёл, что для каждого объекта должен быть один "его" мьютекс? А если у тебя один мютекс вообще на всё, то это будет работать правильно, но медленно.

Как вариант, можно сделать объект-страж, в конструктуре захватывающий мьютекс и в деструкторе освобождающий (в бусте есть). Тогда пользоваться можно так:

{ //просто блок

AnonymousGuard(&somemutex);

obj.metod(arg);

} // тут страж сдох и мютекс свободен

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

Напутал

{ //просто блок

AnonymousGuard(&somemutex), obj.metod(arg);

} // тут страж сдох и мютекс свободен

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

Ну это тривиально делается в стиле (точных имён классов не помню):

#define SYNCHRONIZED \
    static mutex __local_mutex;\
    scope_lock lock(&mutex);

void synchronized_function(void * arg) {
  SYNCHRONIZED
  do_something(); 
}

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

> Автор, ты хочешь таким образом избежать втыкивания мютексов во все методы всех объектов? А ты учёл, что для каждого объекта должен быть один "его" мьютекс? А если у тебя один мютекс вообще на всё, то это будет работать правильно, но медленно.

К сожалению, мне такой простой метод с Guard-ом не годится. Придёся делать хитрее, так как места, из которых вызываются методы не должны зависеть от каких-либо потоковых вещей.

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

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

Ну тогда theos предложил нормальный вариант. Его без особого труда можно улучшить и допилить (тем более, что мютекс один глобальный).

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

> Ну тогда theos предложил нормальный вариант. Его без особого труда можно улучшить и допилить (тем более, что мютекс один глобальный).

Не, это тоже не канает. У нас boost запрещён! :-) И вообще, надо, чтобы было Linux/Win совместимо одновременно. Короче, есть что пописать, поизвращаться...

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

>У нас boost запрещён! :-) И вообще, надо, чтобы было Linux/Win совместимо одновременно.

да эти scope_lock aka guard пишутся элементарно. Ну и кроссплатформенный велоmutex пишется за минуту в ifdef'ах

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

>>У нас мозг запрещён! :-)

> очевиднй фикс

Ну, это вообще заказчик boost не хочет. Я их тоже не понимаю, но это уже их личные сексуальные проблемы. :-)

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

>Ну, это вообще заказчик boost не хочет

А я и не говорю что мозг запретили именны вы ;) вообще написание кроссплатформанного софта совместно с запретом на использование кроссплатформенных либ вызывает у меня когнитивный диссонанс.

з.ы. под виндой есть pthreads - так что изобретать собственные мутексы не нужно.

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

>Ну, это вообще заказчик boost не хочет. Я их тоже не понимаю, но это уже их личные сексуальные проблемы. :-)

ну, выдери boost.function + boost.bind в собственную либу. А вообще -- нужная тебе часть на хэдэрах вся, может есть шанс убедить заказчика не плодить ФГМ (ибо решение без буста будет по сути кривым и глючным переписыванием части буста)?

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