C ++: статический член функции, разделяемый между потоками, может блокировать все? - PullRequest
0 голосов
/ 17 января 2011

У меня есть класс, в котором определена статическая функция для работы в стиле C extern C { static void callback(foo bar) { } }. // статика определена в заголовке.

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

Указатель на функцию передается как:

x = init_function(h, queue_id, &callback, NULL);
while(1) { loop_function(x); }

Таким образом, каждый поток имеет одинаковый указатель на & callback.

  1. Функция обратного вызова может блокироваться на минуты.
  2. Каждый объект потока, за исключением того, который получил блокирующий обратный вызов, может снова вызвать обратный вызов.
  3. Если функция обратного вызова существует только один раз, то любой поток, пытающийся выполнить обратный вызов, также заблокируется. Это дало бы мне нежелательную ошибку, примерно интересно спросить: может ли что-нибудь в C ++ работать таким образом? Может быть, из-за extern {} или некоторого использования указателя?

Ответы [ 3 ]

2 голосов
/ 17 января 2011

C ++ не знает о потоках.Нет абсолютно ничего, что заставляло бы один поток автоматически блокировать другой;Вы должны использовать некоторые функции ОС или библиотеки для достижения этой цели.Для любого количества потоков вполне допустимо вызывать одну функцию одновременно.

2 голосов
/ 19 января 2011

Если вы специально не кодируете какую-либо блокировку или не вызываете функцию (включая системные функции), которая имеет какую-то блокировку (например, открытие одного и того же файла для монопольного доступа к записи и т. Д.), Тогда нет способа " блокировать "другие темы". В c или c ++ нет автоматической блокировки функций.

Если обратный вызов выполняет sleep (3600), это не будет блокировать другие потоки. Каждый поток будет вводить обратный вызов и выполнять сон (3600).

Если вы хотите, чтобы потоки ожидали выполнения критического кода, вы должны закодировать механизм блокировки самостоятельно. Обычно вы активируете механизм блокировки перед выполнением кода (обычно называемый «блокировкой»), а затем обычно отключаете блокировку после выполнения кода («разблокировка»). Для этого Linux-кодеры обычно используют мьютексы или атомарные операции gcc.

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

1 голос
/ 17 января 2011

Если функция обратного вызова существует только один раз, то любой поток, пытающийся выполнить обратный вызов, также заблокируется. Это дало бы мне нежелательную ошибку, примерно интересно спросить: может ли что-нибудь в C ++ стать таким? Может быть, из-за extern {} или некоторого использования указателя?

Нет и да.

callback - простая функция. Он может (в принципе) вызываться параллельно двумя потоками, и extern C ничего не меняет в этом.

Однако, если реализация функции callback например. ожидает мьютекса, он может блокировать несколько потоков.

...