首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于多线程的不明之处,该怎么解决

2012-01-31 
关于多线程的不明之处#includewindows.h #include process.h#include stdio.hHANDLEhThreadclassth

关于多线程的不明之处
#include   "windows.h "
#include <process.h>
#include <stdio.h>
HANDLE   hThread;
class   thred1  
{  
public:  
thred1(int   a)
{
//i=a;
}
static   int   i;
static   void   taskmain1(LPVOID   param)
{

int   a;
for(a=0;a <20;a++)
printf( "%d\n ",a);
}
void   StartTask();

};  

void   thred1::StartTask()  
{  
hThread=(HANDLE)_beginthread(taskmain1,sizeof(thred1)*20,NULL);
}  
int   main(int   argc,   char*   argv[])
{
thred1   r1(1);
thred1   r2(2);
r1.StartTask();
r2.StartTask();
                  for(;;);
return   0;
}

这里有2个问题:
1、为何此时无法引用#include <iostream> 或using   namespace   std;等c++预处理命令
2、此时的程序输出结果是第一个线程从0数到15,就被线程2打断,线程2从0数到19,程序不再输出。按我的理解,多线程不是应该能够并发执行么?为何r1线程数到15被打断后不再执行?

[解决办法]
经测试代码正常,估计是你的项目属性有问题。
[解决办法]
呵呵 楼上倒是说了一点,为什么不全说了,我也不用回答了。
关于第一个问题,我没遇到过,也不好说。

第二个问题,因为MFC对于控制台项目,默认使用的是单线程的调试。你的程序是多线程,当然会出错误了。在项目属性中的“运行时库”改为多线程调试。就不会有什么问题了。
[解决办法]
up
[解决办法]
线程创建后,是不会顺序执行的。也就是无法人工设置线程的顺序。

在一个问题是,在使用线程输出时,发生的竞争条件,两个线程会
竞争控制台输出。
对于nt a;
for(a=0;a <20;a++)
printf( "%d\n ",a
可以采用加锁方式
[解决办法]
我将你的程序运行了,没有问题啊?是你看错输出结果了吧?
[解决办法]
我用的是vc6.0,已经有把project-> setting-> c/c++-> code generation里面设置为multithreaded,否则编译根本无法通过,问题是运行之后r1会被r2线程打断,而且两者是顺序执行,而不是交互执行?这不是违背线程的作用么?
----
和楼上的一样,运行无误 !
输出结果为
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 16 17 18 19
这是其中之一 ,结果不唯,但 0-19 输出两遍无疑!
[解决办法]
关于第一个问题,VC7里也是绝对没有问题的。呵呵,在以前使用VC6的时候,我确实没用过
using namespace std;这个应该是环境不支持吧。
[解决办法]
1.应该是配置问题
2.线程的执行顺序是系统控制的
[解决办法]
#include <iostream> 需要使用debug版本(例如上面程序:project-> setting-> c/c++-> code generation-> debug multithreaded)
使用using namespace std;需要先#include <list> 或#include <deque> 或#include <vector> 等

热点排行