包含原子操作的链接:
InterlockedCompareExchange 模拟callonce
现在假设有一个套接字状态的原子变量 atomic_int socketState;
在一个设计不良的多线程环境中, N个线程都会修改此状态,但只能执行一次;
enum EnumSocketState { SocketStateNone = 0 , SocketStateAlive = 1, SocketStateClosed = 2};
std::atomic_int socketState( EnumSocketState::SocketStateNone ); //状态
//只修改一次
bool changeSocketStateAlive() {
int iExp = EnumSocketState::SocketStateNone;
return socketState.compare_exchange_strong(iExp,EnumSocketState::SocketStateAlive);
}
unsigned int __stdcall thread_func(void * arg) //线程函数
{
using namespace std;
if(changeSocketStateAlive()) {
cout << "tid: " << GetCurrentThreadId() << " change" << endl;
}
return 0;
}
原子的比较:
bool isSocketAlive() {
int iExp = EnumSocketState::SocketStateAlive;
return socketState.compare_exchange_strong(iExp,iExp);
}