グローバル変数は必要ありません。スレッド ルーチンはパラメーターを受け取ることができるため、動的に割り当てられたものを含め、任意の種類の変数である可能性があることに注意してください。
通常、スレッドをクラス内に「ラップ」する必要があります。次のようなものです。
struct Thread
{
Thread() : m_thread(&Thread::run, this) {}
void run()
{
// access the current object's member variables, eg:
do_something_with(m_myvar);
}
Object m_myvar;
std::thread m_thread;
};
condition_variable
しかし、グローバル変数のこの小さな詳細を脇に置いておけば、あなたの #1 は正しいです...ミューテックスとオプションで(ウェイクアップ トリガーとして機能する) によって保護された変数 (メッセージ キュー、ブール値など) を介した通信ほとんどの場合、行く方法です。
私はほとんどの場合、スレッドセーフなメッセージキュー (つまり、) を使用してスレッドstd::queue + mutex + condition_variable
間 (プロデューサー/コンシューマーパターン) を通信することになります。これは、スレッドを分離して通信できるようにするための非常に効率的な方法です。
実際、1 つのプロセス内で直接メモリ アクセス以外の方法が有効な場合はほとんどありません。
私が今考えることができるのは、すでにいくつかのプロセス間コード(ソケットや共有メモリなど)が機能している場合、このコードを再利用して、プロセス内またはプロセス間で統一されたインターフェースを可能にすることです。コミュニケーション。ただし、自分をからかわないでください。直接メモリアクセスとして効率が低下します。ただし、統一されたインターフェースの利点により、効率の低下を簡単に克服できます。私見、あなたは本当にケースバイケースでこの種のものに対処する必要があります.