if语句在判断是否符合条件的同时,是否会被多线程打断?现在不考虑if语句中嵌入调用函数的情况,就是简单的,变量间的比较int a = 0;int main()
{
for( int i = 0 ; i < 10 ; ++i)
{
hThread = CreateThread(NULL,0,ThreadOne,0,0,0);
CloseHandle(hThread);
hThread = CreateThread(NULL,0,ThreadTwo,0,0,0);
CloseHandle(hThread);
}
}DWORD WINAPI ThreadOne(PVOID para)
{
InterLockedExchangeAdd(&a,1);
if(a == 2)
return 0;
}DWORD WINAPI ThreadTwo(PVOID para)
{
InterLockedExchangeAdd(&a,1);
if(a == 3)
return 0;
}我想问的是。在线程1执行时,他给全局变量加1后等于2,在进入if语句后。线程二有可能把他抢占过去吗?从而导致比较失败?
{
for( int i = 0 ; i < 10 ; ++i)
{
hThread = CreateThread(NULL,0,ThreadOne,0,0,0);
CloseHandle(hThread);
hThread = CreateThread(NULL,0,ThreadTwo,0,0,0);
CloseHandle(hThread);
}
}DWORD WINAPI ThreadOne(PVOID para)
{
InterLockedExchangeAdd(&a,1);
if(a == 2)
return 0;
}DWORD WINAPI ThreadTwo(PVOID para)
{
InterLockedExchangeAdd(&a,1);
if(a == 3)
return 0;
}我想问的是。在线程1执行时,他给全局变量加1后等于2,在进入if语句后。线程二有可能把他抢占过去吗?从而导致比较失败?
看看我像下面这样改是否会避免线程冲突的可能
int a = 0;int main()
{
for( int i = 0 ; i < 10 ; ++i)
{
hThread = CreateThread(NULL,0,ThreadOne,0,0,0);
CloseHandle(hThread);
hThread = CreateThread(NULL,0,ThreadTwo,0,0,0);
CloseHandle(hThread);
}
}DWORD WINAPI ThreadOne(PVOID para)
{
InterLockedExchangeAdd(&a,1);
if(InterLocketCompareExchange(&a,2,2) == 2)
{
InterLocketExchange
return 0;
}DWORD WINAPI ThreadTwo(PVOID para)
{
InterLockedExchangeAdd(&a,1);
if(InterLocketCompareExchange(&a,3,3) == 3)
return 0;
}
打错一字母。不好意思。。
volatile int a = 0; //声明volatileint main()
{
for( int i = 0 ; i < 10 ; ++i)
{
hThread = CreateThread(NULL,0,ThreadOne,0,0,0);
CloseHandle(hThread);
hThread = CreateThread(NULL,0,ThreadTwo,0,0,0);
CloseHandle(hThread);
}
}DWORD WINAPI ThreadOne(PVOID para)
{
InterLockedExchangeAdd(&a,1);
int b = a; //取变量值到局部栈区,避免a的值有变化对函数有影响
if(b == 2)
return 0;
}DWORD WINAPI ThreadTwo(PVOID para)
{
InterLockedExchangeAdd(&a,1);
int b = a;
if(b == 3)
return 0;
}
EnterCriticalSection(&cs)
a++;
if(a == 2){...}
LeaveCriticalSection()