はい:Boost.Threadは素晴らしいですし、あなたのニーズに非常によく合うはずです。 (最近、多くの人がBoostをビルトイン機能として数えることができると言っています)。
すぐに使用できるクラスはありませんが、手元に同期プリミティブがあれば実際には、スレッドセーフなラッパーを実装するのは非常に簡単です(たとえば、std::stack
)。あなたがC++に慣れていない場合、およそRAIIを学ぶください
template <typename T> class MyThreadSafeStack {
public:
void push(const T& item) {
boost::mutex::scoped_lock lock(m_mutex);
m_stack.push(item);
}
void pop() {
boost::mutex::scoped_lock lock(m_mutex);
m_stack.pop();
}
T top() const { // note that we shouldn't return a reference,
// because another thread might pop() this
// object in the meanwhile
boost::mutex::scoped_lock lock(m_mutex);
return m_stack.top();
}
private:
mutable boost::mutex m_mutex;
std::stack<T> m_stack;
}
:それは、この(すべてのメソッドを実装していない...)のようになります。このケースに関連して、Boost.Threadはロックを解除することを忘れることによって脚に身を投げ込むのを困難にする "スコープロック"クラスを持っています。
あなたは今まで自分がこのようなコードを書いて見つけた場合:
void doStuff() {
myLock.lock();
if (!condition) {
reportError();
myLock.unlock();
return;
}
try {
doStuffThatMayThrow();
}
catch (std::exception& e) {
myLock.unlock();
throw e;
}
doMoreStuff();
myLock.unlock();
}
、(ブーストから構文直接ではなく)、あなたはただノーと言うべきであり、代わりにRAIIを行く:
void doStuff() {
scoped_lock lock;
if (!condition) {
reportError();
return;
}
doStuffThatMayThrow();
doMoreStuff();
}
ポイントscoped_lock
オブジェクトが有効範囲外になると、そのデストラクタはリソース(この場合はロック)を解放します。これは、例外をスローしてスコープを終了するかどうかにかかわらず、または関数の途中で仲間が巧妙に追加した奇数return
ステートメントを実行することによっても、いつでも起こります。
x86 PUSH/POP命令のアトミシティに興味がある場合は、スタックデータ構造にアクセスするためにこのような命令を使用しないC++とは何の関係もありません。 –
委員会は、TR1の必須のコンパイラ(おそらくTR2でさえない)のために、原子レベルの、より良いメモリモデルの抽象化を行うのではなく、DDJの並列説教クラスを書く方が忙しいです。 答えます:あなたは本当にプッシュしてポップしないので、スレッド間で暗黙的にレジスタを変更すると、現在異なるコアで実行されています。 :-)良いショットですが、うまくいきません。ロックフリーでも、少なくともCASハンマーなしではできません。 C++ zealotsの場合:既存のコヒーレンシープロトコルを定義して同意し、新しい開発のためのいくつかの範囲を残すだけです。 –
関心のある人は原子操作を見て、Intelはcmpxchg16bを介してDCASをサポートしています。残念ながら、AMDにはcmpxchg8bしかありません。私はIntelマシンのために書いているので、私にとって重要ではありません:) – bugmenot77