新手关于线程创建(孙鑫的)

herostarone 2010-05-18 02:02:33
程序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;这样比较长的字符串,输出有可能在前几行行出现交叉,也就是第一个输出的和第二个输出的交叉在一起了,但有时候又是正常的,不知道如何对双核实现双线程?


...全文
61 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyq5945 2010-05-18
  • 打赏
  • 举报
回复
while(TRUE)
{
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
}

这里逻辑问题,tickets在第一个执行线程减到0了,才退出循环,第二个执行的线程看是0就退出了,没机会打印。把while循环去掉看看。
herostarone 2010-05-18
  • 打赏
  • 举报
回复
我知道是根据时间片啊,你看看我第一个程序分析的对吗,也是根据时间片分析的
[Quote=引用 1 楼 zyq5945 的回复:]
线程执行是根据CPU分配的时间片来执行的,具体你搜下“CPU 时间片”。
[/Quote]
zyq5945 2010-05-18
  • 打赏
  • 举报
回复
线程执行是根据CPU分配的时间片来执行的,具体你搜下“CPU 时间片”。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧