多线程使用printf会有问题吗?

sevenzb 2003-07-06 11:57:32
我用多线程写了一段程序大家看一下:
#include <windows.h>
#include <stdio.h>

int count1=0;
int count2=0;
int count3=0;
int count4=0;
int count5=0;
int count6=0;
int count7=0;
int count8=0;
int count9=0;
int count10=0;

DWORD WINAPI No1Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No1Thread:%d\n",count1++);
}
return 0;
}
DWORD WINAPI No2Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No2Thread:%d\n",count2++);
}
return 0;
}

DWORD WINAPI No3Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No3Thread:%d\n",count3++);
}
return 0;
}
DWORD WINAPI No4Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No4Thread:%d\n",count4++);
}
return 0;
}
DWORD WINAPI No5Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No5Thread:%d\n",count5++);
}
return 0;
}

DWORD WINAPI No6Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No6Thread:%d\n",count6++);
}
return 0;
}
DWORD WINAPI No7Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No7Thread:%d\n",count7++);
}
return 0;
}
DWORD WINAPI No8Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No8Thread:%d\n",count8++);
}
return 0;
}

DWORD WINAPI No9Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No9Thread:%d\n",count9++);
}
return 0;
}

DWORD WINAPI No10Thread(LPVOID lpParameter)
{
while(1)
{
Sleep(10);
printf("No10Thread:%d\n",count10++);
}
return 0;
}

void main()
{
unsigned long t1;
unsigned long t2;
unsigned long t3;
unsigned long t4;
unsigned long t5;
unsigned long t6;
unsigned long t7;
unsigned long t8;
unsigned long t9;
unsigned long t10;
char *p=new char;
while(1)
{
CreateThread(NULL,0,No1Thread,(LPVOID)p,0,&t1);
CreateThread(NULL,0,No2Thread,(LPVOID)p,0,&t2);
CreateThread(NULL,0,No3Thread,(LPVOID)p,0,&t3);
CreateThread(NULL,0,No4Thread,(LPVOID)p,0,&t4);
CreateThread(NULL,0,No5Thread,(LPVOID)p,0,&t5);
CreateThread(NULL,0,No6Thread,(LPVOID)p,0,&t6);
CreateThread(NULL,0,No7Thread,(LPVOID)p,0,&t7);
CreateThread(NULL,0,No8Thread,(LPVOID)p,0,&t8);
CreateThread(NULL,0,No9Thread,(LPVOID)p,0,&t9);
CreateThread(NULL,0,No10Thread,(LPVOID)p,0,&t10);
}
}

编译运行时,照理来说每个线程对应某个count值只会打印一次,可是出现有时会打印两次的情况。
如:
...........
No10Thread:502
No10Thread:502
...........
难道多线程使用printf会有问题?
详细运行结果见
http://home1.photoisland.com.cn/sessions/59428769970/1231492.jpg
...全文
1052 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2003-07-07
  • 打赏
  • 举报
回复
我同事写的程序使用printf也遇到过多次打印的问题,奇怪,我就没遇到过。

不过,总比cout好多了,使用cout,如果不使用临界区的话,可能会打印成:
NoN1o010TThrhe
reaadd::550022
^o^
grey_whp 2003-07-07
  • 打赏
  • 举报
回复
建议看看sun出的关于其unix的安全介绍,其中关于c标函数在多线情况下的运行安全级别,
推理:俺认为在microsoft的平台上只会比sun的多线控制差
广告:各地新华书店均有销售(^_^)
sevenzb 2003-07-07
  • 打赏
  • 举报
回复
问题已经解决了,感谢 HeavenS(King Of Terran);
yuanbocsut(寒潭孤雁) 你能不能说详细点~~~~
HeavenS 2003-07-07
  • 打赏
  • 举报
回复
因为你们用的run-time library库不同,你的是mutli-thread lib,
他的是single-thread lib.

这样改: Project->Settings->C/C++->Code Generation->
把use run-time library 改成想要的方式。
如果希望在多线程中使用,那么要选择multithreaded dll
penter 2003-07-07
  • 打赏
  • 举报
回复
agree with HeavenS(King Of Terran) ( )

agree with phiger(phiger) ( )
danielzhu 2003-07-07
  • 打赏
  • 举报
回复
WINDOWS2000编程技术内幕中关于线程多线程中提到,启动线程有三种方法,其中你的那种方法启动线程同时有应用c运行库函数,可能造成内存泄漏,但没提到你讲的现象.
phiger 2003-07-07
  • 打赏
  • 举报
回复
agree with HeavenS(King Of Terran) ( )

15,471

社区成员

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

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