我有一些懷疑,這些mutexes足以確保下面的代碼示例的線程安全性,或者如果需要原子。總之問題是:idxActive
會使得這個代碼線程不安全嗎?或者,即使原子線程不安全的代碼? :( 如果是重要的,我在32位x86,Linux上,GCC 4.6。當然,我推測,32位或64位是沒有差異,但如果有任何差異,我想知道32和64之間的位。互斥體+原子是否需要使此代碼線程安全,或者足夠互斥?
#include <memory>
#include <boost/thread/thread.hpp>
#include <string>
#include <vector>
#include <atomic>
#include <boost/thread/mutex.hpp>
using namespace std;
using namespace boost;
static const int N_DATA=2;
class Logger
{
vector<string> data[N_DATA];
atomic<int> idxActive;
mutex addMutex;
mutex printMutex;
public:
Logger()
{
idxActive=0;
for (auto& elem: data)
elem.reserve(1024);
}
private:
void switchDataUsed()
{
mutex::scoped_lock sl(addMutex);
idxActive.store((idxActive.load()+1)%N_DATA);
}
public:
void addLog(const string& str)
{
mutex::scoped_lock sl(addMutex);
data[idxActive.load()].push_back(str);
}
void printCurrent()
{
mutex::scoped_lock sl(printMutex);
switchDataUsed();
auto idxOld=(idxActive.load()+N_DATA-1)%N_DATA; //modulo -1
for (auto& elem:data[idxOld])
cout<<elem<<endl;
data[idxOld].clear();
}
};
int main()
{
Logger log;
log.addLog(string("Hi"));
log.addLog(string("world"));
log.printCurrent();
log.addLog(string("Hi"));
log.addLog(string("again"));
log.printCurrent();
return 0;
}
這是不是屬於上codereview.SE? –
你知道你現在有std頭''和''? –
@ Kerrek SB-是的,舊習慣很難消逝。 – NoSenseEtAl