我有一些怀疑,这些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