У меня есть простой код 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
.