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