0

私は現在、QT (4) を使用して、非プログラマーによって C で記述されたスレッドセーフではないライブラリを並列化しているため、多くのグローバル変数があります。スレッドは対話したりデータを共有したりする必要はありません。それぞれがライブラリの一連のメソッドを呼び出すだけで、最後にライブラリはさらに使用される出力を提供します。

ただし、問題は、グローバル変数がデフォルトでスレッド間で共有されているため、ライブラリがさまざまな場所でクラッシュすることです。これを修正するには、次の 2 つの方法があります。

グローバル変数を使用しないようにライブラリ全体をリファクタリングするか (痛い)、グローバル変数を非共有にする方法を見つけるか、3 つ目の魔法の方法を見つけます。

後者は QT または標準 (C++01) C++ のオプションですか?

4

3 に答える 3

2

スレッド ローカル ストレージの使用は、グローバル変数を非共有にする方法です。そのための出発点と、さまざまな実装の詳細へのリンクがあります。

http://en.wikipedia.org/wiki/Thread-local_storage

于 2012-10-17T10:07:08.337 に答える
1

グローバル変数を「共有解除」することはできません。並列化 (バーのリファクタリング) で利用できる唯一のオプションは、複数のスレッドではなく複数のプロセスを使用することです。できればプール。

于 2012-10-17T09:49:25.217 に答える
0

グローバル変数へのアクセスの同期を担当するシングルトンを作成します。グローバル変数は新しいシングルトン クラスのメンバーになり、現在のグローバル変数と同じ名前のメソッドからアクセスできるため、コードをあちこち変更する必要はありません。

于 2012-10-17T10:43:07.140 に答える