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会发生么? 请教....

解决方案 »

  1.   

    答案是不会,因为WaitForSingleObject是一个内核线程同步方法
    当WaitForSingleObject时,该线程被阻塞,并切换到其他线程
    直到WaitForSingleObject等待的内核对象变成通知状态
    而这个例子中等待的是一个信号量semaphoreWrite
    一旦线程WaitForSingleObject成功,就获得了该信号量,其他线程必然还是阻塞中
      

  2.   

    不好意思少写了个 ,程序是一共有三个写操作还个WriteC,  分别是写 AAA……  BBB……  CCC……
    而信号量创建时参数是(2,2) 是允许同时两个在操作,  所以上面WriteA,WriteB两个是可以同时进行的吧???那会有问题么?
      

  3.   

    不好意思少写了个 ,程序是一共有三个写操作还个WriteC, 分别是写 AAA…… BBB…… CCC……
    而信号量创建时参数是(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请按任意键继续 . . .
      

  4.   

    建议楼主看一下《windows核心编程》第8章,对于线程的同步讲的很详细。介绍个同步方法:
    InitializeCriticalSetion
    EnterCriticalSection
    LeaveCriticalSection