MFC中同步有关问题 用信号量
MFC中同步问题 用信号量
UINT WriteA(LPVOID pParam)
{
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i <10;i++)
{
pEdit-> GetWindowText(str);
g_Array[i]= ' 'A ' ';
str=str+g_Array[i];
pEdit-> SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteB(LPVOID pParam)
{
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i <10;i++)
{
pEdit-> GetWindowText(str);
g_Array[i]= ' 'B ' ';
str=str+g_Array[i];
pEdit-> SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
省去了无关步骤, g_Array[10] 为全局变量, 该程序是练习信号互斥的,结果是WriteA输出AAAAAAAAAA, WriteB输出BBBBBBBBBB. 我觉得在WriteA中g_Array[i]= ' 'A ' ';时如果发生context switch 切换到 WriteB的g_Array[i]= ' 'B ' ', 然后在发生context switch 切换到WriteA的str=str+g_Array[i]; 那么是不是就不能像要求的那样输出一个字符串AAAAAAAAAA了? 而变成 AAAABAAAAA; 这种context switch会发生么? 请教....
------解决方案--------------------
答案是不会,因为WaitForSingleObject是一个内核线程同步方法
当WaitForSingleObject时,该线程被阻塞,并切换到其他线程
直到WaitForSingleObject等待的内核对象变成通知状态
而这个例子中等待的是一个信号量semaphoreWrite
一旦线程WaitForSingleObject成功,就获得了该信号量,其他线程必然还是阻塞中
------解决方案--------------------
建议楼主看一下《windows核心编程》第8章,对于线程的同步讲的很详细。介绍个同步方法:
InitializeCriticalSetion
EnterCriticalSection
LeaveCriticalSection
UINT WriteA(LPVOID pParam)
{
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i <10;i++)
{
pEdit-> GetWindowText(str);
g_Array[i]= ' 'A ' ';
str=str+g_Array[i];
pEdit-> SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteB(LPVOID pParam)
{
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i <10;i++)
{
pEdit-> GetWindowText(str);
g_Array[i]= ' 'B ' ';
str=str+g_Array[i];
pEdit-> SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
省去了无关步骤, g_Array[10] 为全局变量, 该程序是练习信号互斥的,结果是WriteA输出AAAAAAAAAA, WriteB输出BBBBBBBBBB. 我觉得在WriteA中g_Array[i]= ' 'A ' ';时如果发生context switch 切换到 WriteB的g_Array[i]= ' 'B ' ', 然后在发生context switch 切换到WriteA的str=str+g_Array[i]; 那么是不是就不能像要求的那样输出一个字符串AAAAAAAAAA了? 而变成 AAAABAAAAA; 这种context switch会发生么? 请教....
------解决方案--------------------
答案是不会,因为WaitForSingleObject是一个内核线程同步方法
当WaitForSingleObject时,该线程被阻塞,并切换到其他线程
直到WaitForSingleObject等待的内核对象变成通知状态
而这个例子中等待的是一个信号量semaphoreWrite
一旦线程WaitForSingleObject成功,就获得了该信号量,其他线程必然还是阻塞中
------解决方案--------------------
建议楼主看一下《windows核心编程》第8章,对于线程的同步讲的很详细。介绍个同步方法:
InitializeCriticalSetion
EnterCriticalSection
LeaveCriticalSection