全部代码
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int index=0;
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while(index++<1000)
{
cout<<"11111111111"<<endl;
}
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(index++<1000)
{
cout<<"222222222222"<<endl;
}
return 0;
}
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int index=0;
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while(index++<1000)
{
cout<<"11111111111"<<endl;
}
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(index++<1000)
{
cout<<"222222222222"<<endl;
}
return 0;
}
解决方案 »
- 请问VC中如何编程显示ppm格式的文件?
- 求CImage显示png图片用法
- 高手进来看看啊!有关GDI+问题
- 请问CMultiDocTemplate()的第一个参数应该怎么加?
- 请问一下:通过注册表给应用程序加上dll的注册表健值是什么?就是有点像"initdll"的那个
- Win32中用mfc的问题,请指点。
- 微软管理服务的程序哪位知道叫什么名字?
- 求解!!数据库的问题
- 谁有Visual Assist4.1的注册码,急用!
- 如果一个com组件dll,没有类型库,没有实现idispatch接口,不能生成头文件
- 引入dll后出现“未使用调试信息生成二进制文件”的错误
- 如何通过GDI+修改一个bmp图片的位深度(灰度位)
就是在 执行cout时 输出了两遍如
111111111111122222222222222
1111111111111
111111111111122222222222222
因为在C的库中有全局变量,这样用C的库时,如果程序中使用了标准的C的库时,就很容易导致运行不正常,会引起很多的冲突。所以,微软和Borland都对C的库进行了一些改进。但是这个改进的一个条件就是,如果一个线程已经开始创建了,就应该创建一个结构来包含这些全局变量,接着把这些全局变量放入线程的上下文中和这个线程相关起来。这样,全局变量就会依赖于这个线程,不会引起冲突。
可是我看孙鑫的教程 他的执行很正常
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
cout<<"main is run"<<endl;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
cout<<"thread1 is run"<<endl;
return 0;
}
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int i=100;
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while(i-->0)
cout<<"main is run"<<endl;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(i-->0)
cout<<"thread1 is run"<<endl;
return 0;
}
执行结果的图片 不知道怎么发上来 请您亲自执行以下了
到底是怎么回事 大师指教
全部代码如下 请大师调试一下 就看出问题了
#include<windows.h>
#include<iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int index=0;
int tickets=100;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
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)
{
while(TRUE)
{
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
if(tickets>0)
{
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
}
return 0;
}
结果的图片我整不上去 麻烦大家试一下了
debug环境下只输出main is run
release环境下有输出thread1 is run的情况
没有发现混乱的迹象
我的系统是windows 8消费者预览
IDE是VS2008
不知道你还想知道什么信息
我个人认为大家应该把问题说的很清楚了
如果只为了理论研究你现在做的已经很好了
如果是为了实际应用那没有必要纠结于这个问题
1.您测试的我那个程序 出现thread1 is run vc6.0下
不管是release下还是debug 概率大概是0.2
2.它出现thread1 is run 它就不对 主线程很短 就输出main is run 就到退出的时候了
thread1 根本就没机会执行
3.为了验证 我做了一个模拟买火车票的程序 这样两个线程就会有交互运行的机会
我发现 一旦运行到 cout....时间片就到了 说以俩个线程不是按时间片转换的
是按在调用 cout的地方转换的
4.假如在程序中不用cout 线程是按时间片转换的
5.它在cout 转换的时候 也不这行 cout 而是在下一个线程的cout出执行
这样会出现 thread1 sell ticket : thread2 sell ticket : 3 4
6.就算这样 为什么换行符“endl”没有输出 且数字 放到一起输出
7. 我想做一个聊天室的程序 用到cout 所以避免不了
就像火车票程序 总不能1线程买一张 2线程买一张 我想让它按时间片轮转
并且输出的规律 不要出现thread1 sell ticket:thread2 sell ticket : 3 4这种情况
8.不知道我的问题描述清楚了没有
请您在帮我最后一次
希望您能执行一下 上面的两个程序 执行完 我想您也知道我想问什么了
火车票系统 还有一个是为了验证它在cout出转换了 俩个程序全部代码在下面
#include<windows.h>
#include<iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int index=0;
int tickets=100;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
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)
{
while(TRUE)
{
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
if(tickets>0)
{cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
}
return 0;
}
---------------------------------------第二个------------------------------------
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int i=100;
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
while(i-->0)
cout<<"main is run"<<endl;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(i-->0)
cout<<"thread1 is run"<<endl;
return 0;
}
首先线程调动是系统行为
我们干预不了
没有什么执行到main is run时间片就没了的说法
很可能刚刚输出main i这是系统有挂起当前线程然后调用工作线程输出thread1 is run
而且cout类的操作是执行流控制
一个进程内的流是统一的
如果不做好同步流混乱这是正常的
所谓cout不是线程安全的就是说的这个意思
所以我就不理解了 谢谢大家
结贴
这个问题我是明白了 可还是没解决 那不会了希望老师们帮帮忙 离校后解决bugue真的很头疼
再次感谢老师们
#include<iostream>
#include<stdlib.h>using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int tickets=100;
HANDLE hMutex;
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);
system("pause");}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while(TRUE)
{
if(tickets>0)
{
WaitForSingleObject(hMutex,INFINITE);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
ReleaseMutex(hMutex);
}
else
break;
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
if(tickets>0)
{
WaitForSingleObject(hMutex,INFINITE);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
ReleaseMutex(hMutex);
}
else
break;
}
return 0;
}