Как сделать C (P/invoke )код, вызываемый из C #«Thread -безопасный»

У меня есть простой код C -, в котором используется одна глобальная -переменная. Очевидно, что это не потокобезопасно -, поэтому, когда я вызываю его из нескольких потоков в C #с помощью P/invoke, все идет косяком.

Как я могу либо импортировать эту функцию отдельно для каждого потока, либо сделать ее потокобезопасной -?

Я попытался объявить переменную __declspec(thread), но это привело к падению программы. Я также пытался создать класс C++/CLI, но он не позволяет функциям-членам -быть __declspec(naked), что мне нужно(Я использую встроенную -сборку). У меня нет большого опыта написания многопоточного -кода на C++, поэтому я мог что-то упустить.


Вот пример кода:

C#

[DllImport("MyDll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int SomeFunction(int parameter1, int parameter2);

C++

extern "C"
{
    int someGlobalVariable;
    int __declspec(naked) _someFunction(int parameter1, int parameter2)
    {
        __asm
        {
            //someGlobalVariable read/written here
        }
    }
    int __declspec(dllexport) SomeFunction(int parameter1, int parameter2)
    {
        return _someFunction(parameter1, parameter2);
    }
}

[Редактировать]:Результат SomeFunction()должен идти в определенном порядке, основанном наsomeGlobalVariable(подумайте, например. PRNG с someGlobalVariableв качестве внутреннего состояния). Таким образом, использование мьютекса или другого вида блокировки не является вариантом -каждый поток должен иметь свою собственную копию someGlobalVariable.

10
задан BlueRaja - Danny Pflughoeft 30 April 2012 в 18:42
поделиться