옙 : 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 잠금 장치를 사용하지 않거나 적어도 CAS 망치를 사용할 수는 없습니다. C++ zealots의 경우 : 그들은 단지 앉아서 기존 일관성 프로토콜을 정의하고 동의해야하며 새로운 개발을위한 일부 범위를 남겨 두어야합니다. –
관심이있는 사용자는 원자 작업을 조사하고 cmpxchg16b를 통해 DCAS를 지원합니다. 불행히도 AMD에는 cmpxchg8b 만 있습니다. 내가 Intel 머신 용으로 작성한 이래로 중요하지 않다. – bugmenot77