私の理解が正しいことを確認したい。この種のことはトリッキーなので、何かが欠けているとほぼ確信しています。リアルタイム スレッドと非リアルタイム スレッドで構成されるプログラムがあります。非 RT スレッドが、RT スレッドによって使用されるメモリへのポインターをスワップできるようにしたい。
ドキュメントから、私の理解では、これは次の方法で実現できますg++
。
// global
Data *rt_data;
Data *swap_data(Data *new_data)
{
#ifdef __GNUC__
// Atomic pointer swap.
Data *old_d = __sync_lock_test_and_set(&rt_data, new_data);
#else
// Non-atomic, cross your fingers.
Data *old_d = rt_data;
rt_data = new_data;
#endif
return old_d;
}
これは、(初期セットアップ以外の) プログラム内でrt_data
が変更される唯一の場所です。がrt_data
リアルタイム コンテキストで使用されると、ローカル ポインターにコピーされます。の場合old_d
、後で古いメモリが使用されていないことが確認されると、非 RT スレッドで解放されます。これは正しいです?volatile
どこか必要ですか?呼び出す必要がある他の同期プリミティブはありますか?
ちなみにC++でやってますが、Cだと答えが違うのか気になります。
ありがとうございます。