多线程以及输出窗口问题

yangkunhenry 2009-03-05 12:50:48

#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI MyThread1(
LPVOID lpParameter
);
DWORD WINAPI MyThread2(
LPVOID lpParameter
);
int Index=0;
int tickets=30;
int main()
{
HANDLE handle1;
HANDLE handle2;
handle1=CreateThread(NULL,0,MyThread1,NULL,0,NULL);
handle2=CreateThread(NULL,0,MyThread2,NULL,0,NULL);
CloseHandle(handle1);
CloseHandle(handle2);
Sleep(1000);
return 0;
}
DWORD WINAPI MyThread1(LPVOID lpParameter)
{
while(TRUE)
{
if(tickets>0)
cout<<"The tickets is: "<<tickets--<<endl;
else
break;
}
return 0;
}
DWORD WINAPI MyThread2(LPVOID lpParameter)
{
while(TRUE)
{
if(tickets>0)
cout<<"The tickets is: "<<tickets--<<endl;
else
break;
}
return 0;
}
输出怎么是这个样啊?好乱啊!!!
ThTeh tickets is: e tickets is: 320
The tickets is:9
The tickets is: 27
The tickets is 2: 26
The tickets i8
The tickets is: 24
The tickets iss:: 23
The tickets 25
The tickets iis: 22
The ticketss: 21
The tickets is: 19
The ticket iss: 20
The ticket is: 18
The tickets is: 16
The ticksets is: 15
The tic is: 17
The tickets is: 13
The tickkeets is: 14
The tits is: 12
The tickets is: 10
The ticckets is: 11
The tkets is: 9
The tickets is: 7
The tiicckets is: 8
The tkets is: 6
The tickets is: 4
The tiicckets is: 5
The tkets is: 3
The tickets is: 1
ickets is: 2
Press any key to continue

还有个问题,如果这个程序MultiThread.cpp在VS2005中生成在cmd.exe中
而且没有滚动条,怎么设置VS2005,才能让程序结果生成在MultiThread.exe中啊?
很着急,很郁闷啊!
...全文
112 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fandh 2009-03-05
  • 打赏
  • 举报
回复
你这边的程序没有使用互斥或者临界变量什么的,应该乱的!
建议看看多线程访问数据的部分!
oyljerry 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangkunhenry 的回复:]
引用 8 楼 cnzdgs 的回复:
2、像运行窗口程序一样,直接双击文件图标运行。

我没说清楚,我意思是在Alt+F5之后想让运行结果出现在生成的.exe中而不是cmd.exe中
[/Quote]
你一样要做同步,以及清空cout的缓存
cnzdgs 2009-03-05
  • 打赏
  • 举报
回复
Alt+F5?是Ctrl+F5吧?VC是用cmd.exe来加载的,这样有什么关系?最后发布程序又不会在VC中运行。
yangkunhenry 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
2、像运行窗口程序一样,直接双击文件图标运行。
[/Quote]
我没说清楚,我意思是在Alt+F5之后想让运行结果出现在生成的.exe中而不是cmd.exe中
cnzdgs 2009-03-05
  • 打赏
  • 举报
回复
1、多线程库的printf中有同步处理,可以确保一次调用的结果不被其它线程插入字符。用iostream时,每个<<都是一个函数,所以有可能被打断。
2、像运行窗口程序一样,直接双击文件图标运行。
yangkunhenry 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cnzdgs 的回复:]
没有处理同步就是这样的,如果你用printf每次输出一行,并且使用多线程运行库(2005都是多线程库),各行的输出就不会乱。
对于控制台程序,如果你在cmd窗口加载,结果就显示在当前窗口中,这是正常的。
[/Quote]
1.为什么用printf就可以使输出不会乱?
2.在控制台下的程序如果不想在cmd中加载的话,还能哪儿加载,怎么设置?
我想让运行结果出现在MultiThread.exe中,怎么设置?谢谢满天星!!!
cnzdgs 2009-03-05
  • 打赏
  • 举报
回复
没有处理同步就是这样的,如果你用printf每次输出一行,并且使用多线程运行库(2005都是多线程库),各行的输出就不会乱。
对于控制台程序,如果你在cmd窗口加载,结果就显示在当前窗口中,这是正常的。
oyljerry 2009-03-05
  • 打赏
  • 举报
回复
out是带缓冲的, 如果想多线程, 那么需要同步,并在每次OUT后强制输出缓冲


CCriticalSection lock;

lock.Lock();
cout << "hello" << endl;
fflush(stdout);
lock.Unlock();
Ei 2009-03-05
  • 打赏
  • 举报
回复
线程没有同步,可以参考下 《孙鑫VC++详解》中的 多线程。
野男孩 2009-03-05
  • 打赏
  • 举报
回复
cout输出要加锁控制其并发。
yangkunhenry 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
你这边的程序没有使用互斥或者临界变量什么的,应该乱的!
建议看看多线程访问数据的部分!
[/Quote]
恩,我知道我没有使用互斥,但没使用互斥MS也不该出现这样的问题吧?

15,471

社区成员

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

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