结果中第一个线程打印出的结果不是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);}
请问这个程序执行起来是什么顺序?错哪了?谢谢大虾...代码如下:
#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锁住了临界区,使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);
}