単一のグローバル変数を使用する単純な C コードがあります。明らかにこれはスレッドセーフではないため、C# で P/invoke を使用して複数のスレッドから呼び出すと、問題が発生します。
この関数をスレッドごとに個別にインポートするか、スレッドセーフにするにはどうすればよいですか?
変数を宣言しようとしました__declspec(thread)
が、プログラムがクラッシュしました。__declspec(naked)
また、C++/CLI クラスを作成しようとしましたが、必要なメンバー関数を にすることはできません(インライン アセンブリを使用しています)。私はマルチスレッドの 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);
}
}
[編集] : must go の結果は、(内部状態としてのPRNG などを考えSomeFunction()
てください)に基づいて所定の順序で移動します。そのため、ミューテックスやその他の種類のロックを使用することはオプションではありません。各スレッドには、独自の のコピーが必要です。someGlobalVariable
someGlobalVariable
someGlobalVariable