一个线程简单的问题

sc_valentine21 2008-11-17 06:13:24

#include <windows.h>
#include <iostream.h>
/*using namespace std;*/ //问题就出在这里,用这句,输出的就是乱的,不是按照预期的,为什么?

DWORD WINAPI Thread1Proc(
LPVOID lpParameter
);
int main()
{
HANDLE handle;
handle = CreateThread(NULL, 0, Thread1Proc, NULL, 0, NULL);
CloseHandle(handle);
cout<<"Main is running"<<endl;
Sleep(10);
return 0;
}

DWORD WINAPI Thread1Proc(
LPVOID lpParameter
)
{
cout<<"Thread is running"<<endl;
return 0;
}
...全文
106 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sc_valentine21 2008-11-18
  • 打赏
  • 举报
回复

#include<iostream.h>


#include<iostream>
using namespace std;

这两个我还是晓得用哈,问题可能是上面各位提到的,必须要用线程同步来解决。我编译环境是vc6.或许也有可能是编译有点老的缘故。我猜想虽然用
#include<iostream.h>
能达到预期的效果,但这还是不安全的,正确的做法是线程同步。不知道理解有偏差不?
taodm 2008-11-17
  • 打赏
  • 举报
回复
printf、cout这类IO函数,标准并没要求线程安全。
用正规的线程同步方法来确保输出正确,而不是博命般赌iostream.h这种早就不该存在的头文件里提供的东西。
xxgamexx 2008-11-17
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

要么:

#include<iostream.h>


可能有点点关系 呵呵~~


野马? 呵呵
jackzhhuang 2008-11-17
  • 打赏
  • 举报
回复
我晕,绝对和using namespace std;没有任何关系!

为什么是乱的?

线程就是脱缰的野马,没有同步控制,任何情况都有可能发生。

主函数里面的cout输出的时候,另一个线程的cout有可能会打断,总之他们的输出是随机的,除非有同步控制,哪怕有优先级都有可能是随机的,只有同步控制才能控制线程的行为。

楼主误区在:以为主函数里面的线程启动后就一定会运行到底,其实未必,甚至有可能一直到main即将结束都没运行。
另一个误区是:以为每一句都会一次运行完毕,其实也未必,多线程的时候,你做任何事情,包括给一个整形赋值,半途都会可能有人打断。

比如在多线程环境里:

int i = 0;
i = 9;
cout << i;

未必i就是9,可能i获得9这个值后马上又被其他线程改了,也有可能即将输出i的时候被其他线程改了,总之不要想当然。

多线程编程,必须用同步控制才可以让程序如你所想的运行,否则,行为未定义。
太乙 2008-11-17
  • 打赏
  • 举报
回复
#include <windows.h>
#include <iostream>
using namespace std; //问题就出在这里,用这句,输出的就是乱的,不是按照预期的,为什么?

DWORD WINAPI Thread1Proc(
LPVOID lpParameter
);
int main()
{
HANDLE handle;
handle = CreateThread(NULL, 0, Thread1Proc, NULL, 0, NULL);
CloseHandle(handle);
cout<<"Main is running"<<endl;
Sleep(10);
return 0;
}

DWORD WINAPI Thread1Proc(
LPVOID lpParameter
)
{
cout<<"Thread is running"<<endl;
return 0;
}


要么

#include<iostream>
using namespace std;

要么:

#include<iostream.h>

sss_free 2008-11-17
  • 打赏
  • 举报
回复
你让主线程打印红色字符,新线程打印白色字符,把结果分析一下
la_feng 2008-11-17
  • 打赏
  • 举报
回复
顶一楼,多线程时就应该注意线程同步执行的问题,所以那个乱的输出是正常的,细心看你就会发现所有输出字母还是能组合成你预想的结果的。为什么这样输出呢?那是因为一个线程的输出没完成就切换到另一个线程了,另一个线程刚输出一点又切换回来,依次类推。事实上象一楼那样把时间改长一点是可以看到你预想的结果,但这也不是好方法,因为在运行之前你一般是无法预料线程的执行时间的,因此,严格来说,多线程就应该要处理线程同步问题。还有,对于为什么直接用iostream.h是对的,我的猜想是与c++运行期的优化有关的吧,因为using namespace std;是后来的版本才有的,具体有什么区别我也说不清
cattycat 2008-11-17
  • 打赏
  • 举报
回复
不是
#include <iostream>
using namespace std;

或者直接#include <iostream.h>吗。
damo_xu 2008-11-17
  • 打赏
  • 举报
回复
估计是你的编译器的问题。
using namespace std; 这句话对你程序只是cout起作用。
你能用#include <iostream.h>
说明你的编译器太老了!搜个VS2005/8的免费版吧。

qqwx_1986 2008-11-17
  • 打赏
  • 举报
回复
难道旧的#include <iostream.h>中的cout是线程安全的?
sc_valentine21 2008-11-17
  • 打赏
  • 举报
回复
不行的,我试过了,4000多不行。
直接用iostream.h是对的。
yuwei2589 2008-11-17
  • 打赏
  • 举报
回复
和这句有什么关系呢?


/*using namespace std;*/ //问题就出在这里,用这句,输出的就是乱的,不是按照预期的,为什么?


你创建线程后,线程就和你的主线程之间就会相互切换,本就不可预期结果。可以这样试下:

Sleep(10);//10ms有可能时间太短
cout<<"Main is running"<<endl;

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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