うん: Boost.Threadは素晴らしく、あなたのニーズにぴったり合うはずです。(最近では、多くの人が、Boost をほぼ組み込み機能と見なすことができると言っています。)
すぐに使用できるクラスはまだありませんが、同期プリミティブが手元にあれば、独自のスレッドセーフなラッパーを実装するのは非常に簡単std::stack
です。次のようになります (すべてのメソッドを実装しているわけではありません...):
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;
}
C++ を初めて使用する場合は、RAIIについて学んでください。このケースに関連して、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 を使用する必要があります (構文は Boost から直接ではありません)。
void doStuff() {
scoped_lock lock;
if (!condition) {
reportError();
return;
}
doStuffThatMayThrow();
doMoreStuff();
}
ポイントは、scoped_lock
オブジェクトがスコープ外になると、そのデストラクタがリソース (この場合はロック) を解放することです。return
これは、例外をスローしてスコープを終了するか、同僚が関数の途中でこっそり追加した奇妙なステートメントを実行するか、単に関数の最後に到達するかによって、常に発生します。