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(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等待的内核对象变成通知状态
而这个例子中等待的是一个信号量semaphoreWrite
一旦线程WaitForSingleObject成功,就获得了该信号量,其他线程必然还是阻塞中
而信号量创建时参数是(2,2) 是允许同时两个在操作, 所以上面WriteA,WriteB两个是可以同时进行的吧???那会有问题么?
而信号量创建时参数是(2,2) 是允许同时两个在操作, 所以上面WriteA,WriteB两个是可以同时进行的吧???那会有问题么?
======================================================================================
那就应该会出现你所说的现象,但是这个可能是靠rp的我写了一个console下的例子,和结果#include <stdio.h>
#include <windows.h>HANDLE s;unsigned int test_thread_A( void* lpParameter )
{
int i; WaitForSingleObject( s,INFINITE );
for( i = 0 ; i < 10; i++ )
{
putchar( 'A' );
sleep(500);
} ReleaseSemaphore( s, 1 , NULL );
return 0;
}unsigned int test_thread_B( void* lpParameter )
{ int i; WaitForSingleObject( s,INFINITE );
for( i = 0 ; i < 10; i++ )
{
putchar( 'B' );
sleep(500);
} ReleaseSemaphore( s, 1 , NULL );
return 0;
}unsigned int test_thread_C( void* lpParameter )
{ int i; WaitForSingleObject( s,INFINITE );
for( i = 0 ; i < 10; i++ )
{
putchar( 'C' );
sleep(500);
} ReleaseSemaphore( s, 1 , NULL );
return 0;
}int main()
{
HANDLE t[3];
s = CreateSemaphore( NULL, 2, 2, NULL );
t[0] = _beginthreadex( NULL, 0, test_thread_A, NULL, 0, NULL );
t[1] = _beginthreadex( NULL, 0, test_thread_B, NULL, 0, NULL );
t[2] = _beginthreadex( NULL, 0, test_thread_C, NULL, 0, NULL );
WaitForMultipleObjects( sizeof( t ) / sizeof(t[0]), t, TRUE, 1000 * 20 ); system( "PAUSE" );
return;
}运行结果:
ABABABABABABABABBABACCCCCCCCCC请按任意键继续 . . .
InitializeCriticalSetion
EnterCriticalSection
LeaveCriticalSection