Безопасность потока DLL - PullRequest
0 голосов
/ 02 января 2011

Я разрабатываю DLL в MS VC express c ++, которая будет загружаться в несколько клиентских приложений одновременно, DLL имеет пространство общей памяти, созданное с использованием data_seg(".SHARED_SPACE_NAME"). В этом пространстве общей памяти есть несколько векторов, которые можно изменить. Предположим, у нас есть функция в теле DLL с именем doCalc ():

_DLLAPI void __stdcall doCalc(int argument)  
{  
    //Add to vector  
    //Loop through vector  
    //Erase from vector  
    //etc.  
}

Если doCalc вызывается одновременно из двух или более клиентских приложений, происходит сбой системы. Я хочу, чтобы вызовы doCalc «ждали в очереди» до завершения предыдущего вызова - как если бы это было однопоточное приложение. Таким образом, если клиент 1 вызывает, а затем сразу после вызова клиента 2, то клиент 1 должен завершить функцию, а затем клиент 2 должен запустить функцию.

Лучшим решением было бы запустить DLL как единый поток, но я искал в Интернете, я не думаю, что это возможно.

Я попытался найти эту проблему в Интернете, и я нашел кое-что о том, как сделать функцию static сделавшей ее поточно-безопасной.

Я также читал, что C ++ 0x каким-то образом сделает этот потокобезопасным. Но это не поддерживается в MS VC express.

У меня нет опыта в многопоточности, поэтому я надеюсь, что вы можете помочь. Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 02 января 2011

Windows API для использования здесь будет CreateMutex .Создайте именованный объект мьютекса.Поскольку вам нужно манипулировать общими данными, вызовите WaitForSingleObject с дескриптором мьютекса, а когда закончите, вызовите ReleaseMutex.Каждый поток, который вызывает WaitForSingleObject, становится владельцем мьютекса, и любой другой поток, который вызывает WaitForSingleObject, будет останавливаться, пока поток-владелец не вызовет ReleaseMutex.

Конечно, я не верю, что вы можете делать то, что хотите:

  1. Библиотеки DLL могут быть сопоставлены по разным адресам в каждом пространстве процесса.Если это так, все указатели будут неправильными.
  2. C ++ не позволяет детально контролировать распределение и имеет много неявных распределений, особенно при работе с объектами STL.Я не верю, что вы можете получить вектор для хранения всех соответствующих данных в общей области.

Вам придется делать это с необработанными массивами в стиле C.

3 голосов
/ 02 января 2011

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

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

Я думаю, что Boost.Interprocess - это именно то, что вам нужно.Это решит и проблему синхронизации, и ту, о которой Джим Бриссом сказал в своем комментарии, о которой вы даже не думали.

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