У меня есть простой C-код, который использует одну глобальную переменную. Очевидно, что это не потокобезопасно, поэтому, когда я называю это из нескольких потоков в С#, используя P/invoke, все испортится.
Как я могу либо импортировать эту функцию отдельно для каждого потока, либо сделать его потокобезопасным?
Я попытался объявить переменную __declspec(thread)
, но это вызвало сбой программы. Я также попытался создать класс С++/CLI, но он не позволяет функциям-членам __declspec(naked)
, которые мне нужны (я использую встроенную сборку). Я не очень опытен, написав многопоточный код на С++, поэтому может быть что-то, что мне не хватает.
Вот пример кода:
С#
[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
.