多線程(std::async
)通過shared_ptr
共享以下類的實例,是否有可能在這部分代碼中出現分段錯誤?如果我的理解std::mutex
是正確的,mutex.lock()
導致所有其他線程試圖調用mutex.lock()
阻塞,直到mutex.unlock()
被調用,從而獲得了矢量應該按次序發生。我在這裏錯過了什麼嗎?如果沒有,是否有更好的方式來設計這樣的課程(可能是std::atomic_flag
)?多線程課堂互斥分段故障的可能性
#include <mutex>
#include <vector>
class Foo
{
private:
std::mutex mutex;
std::vector<int> values;
public:
Foo();
void add(const int);
int get();
};
Foo::Foo() : mutex(), values() {}
void Foo::add(const int value)
{
mutex.lock();
values.push_back(value);
mutex.unlock();
}
int Foo::get()
{
mutex.lock();
int value;
if (values.size() > 0)
{
value = values.back();
values.pop_back();
}
else
{
value = 0;
}
mutex.unlock();
return value;
}
免責聲明:0 get()
默認值的目的是作爲它在代碼的其餘部分特殊的意義。
更新:上述代碼是完全按照我使用它,除了當然錯字的push_back。
哪裏是賽格故障? – thang 2013-02-12 13:51:02
我沒有看到一個問題,這個類,但你應該使用'lock_guard <>'或'unique_lock <>'來獲取互斥當RAII包裝超出範圍自動釋放。你是在展示整個班級的定義嗎? – 2013-02-12 13:51:59
另外,除了同時訪問這些對象外,你還在做什麼?你是否在複製它們? – 2013-02-12 13:53:01