新手关于线程创建(孙鑫的)
程序1:
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int index=0;
int tickets=100;
HANDLE hMutex, hMutex1;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hMutex=CreateMutex(NULL,FALSE,NULL);
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(4000);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter )
{
WaitForSingleObject(hMutex,INFINITE);
while(TRUE)
{
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
}
ReleaseMutex(hMutex);
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter )
{
WaitForSingleObject(hMutex,INFINITE);
while(TRUE)
{
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
}
ReleaseMutex(hMutex);
}
首先我的电脑是双核处理器的。
我想要的结果是线程1会一直输出,而线程2得不到输出的机会,但是结果是有时候线程1一直输出,有时候线程2一直输出.
我的理解是:当创建完线程1和线程2时候,主线程的时间片还没到,等主线程的时间片到期后,从县城开始执行了,但是该执行从线程1呢还是2呢,所以2个线程存在竞争关系,估:同一个程序会有不同的结果。但是这个程序是孙鑫上的,他书上讲的是只有线程1输出,而我的是线程1或线程2输出。
程序2:
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);
int index=0;
HANDLE hMutex, hMutex1;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hMutex=CreateMutex(NULL,FALSE,NULL);
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while(index++<1000)
cout<<"main"<<endl;
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter )
{
while(index++<1000)
cout<<"threa1"<<endl;
}
如果按照孙鑫所讲,他的电脑是单核处理器,结果应该是主线程数出一会,从线程数出一会,交替进行,但是在我的机器上却是输出:main
threa1
main
threa1
main
threa1
这样一个一个交替执行,是否可以说明双核处理器是2个线程并行执行的呢,但是输出的时候又不可能同时输出,估一个一个的输出了。
还有一个问题就是:
我如果把输出的main和threal改成比较长的字符串,比如cout<<"i am what you are and say say threa1"<<endl;这样比较长的字符串,输出有可能在前几行行出现交叉,也就是第一个输出的和第二个输出的交叉在一起了,但有时候又是正常的,不知道如何对双核实现双线程?