结果中第一个线程打印出的结果不是100000000,但结果中第二个线程打印出的结果是0.
请问这个程序执行起来是什么顺序?错哪了?谢谢大虾...代码如下:
#include <windows.h>
#include <stdio.h>
#include <process.h>#define MAX_THREAD 2//prototypes
int WINAPI thread1(int data);
int WINAPI thread2(int data);//globals
int global = 0;
CRITICAL_SECTION cs;int WINAPI thread1(int data)
{
EnterCriticalSection(&cs); for(int index = 0;index < 100000000;index++)
global++; LeaveCriticalSection(&cs); printf("%d\n",global);
return(1);
}int WINAPI thread2(int data)
{
EnterCriticalSection(&cs); for(int index = 0;index < 100000000;index++)
global--; LeaveCriticalSection(&cs); printf("%d\n",global);
return(1);
}int main()
{
HANDLE thread_handle[MAX_THREAD];
DWORD thread_id[MAX_THREAD]; printf("the main thread is start\n");

InitializeCriticalSection(&cs); if(!(thread_handle[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread1,(LPVOID)0,true,&thread_id[0])))
return(0);

if(!(thread_handle[1] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread2,(LPVOID)1,true,&thread_id[1])))
return(0); WaitForMultipleObjects(MAX_THREAD,thread_handle,true,INFINITE); DeleteCriticalSection(&cs); CloseHandle(thread_handle[0]);
CloseHandle(thread_handle[1]); printf("the main thread is end\n"); getchar(); return(1);}

解决方案 »

  1.   

    当然应该把printf("%d\n",global);放到临界区内部。
      

  2.   

    楼上正确。
    线程1锁住了临界区,使global变为100000,然后解锁,这时线程2才能进临界区,把global变回0。
    你这样试试看结果?
    int WINAPI thread1(int data)
    {
    for(int index = 0;index < 100000000;index++)
             {
               EnterCriticalSection(&cs); global++;          LeaveCriticalSection(&cs);
             } printf("%d\n",global);
    return(1);
    }int WINAPI thread2(int data)
    {
    for(int index = 0;index < 100000000;index++)
             {
             EnterCriticalSection(&cs); global--;           LeaveCriticalSection(&cs);
             }
    printf("%d\n",global);
    return(1);
    }