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

简单多线程程序的有关问题

2014-06-27 
简单多线程程序的问题#include"windows.h "#include #include #include HA

简单多线程程序的问题
#include   "windows.h "
#include <process.h>
#include <stdio.h>
#include <iostream>
HANDLE   hThread;
DWORD   BUS= '\0 ';
class   thred1  
{  
public:  
thred1(int   a)
{
}
static   void   CS()//载波侦听
{
while(BUS!= '\0 ');//等待总线空闲
}
static   void   SendToBus()//发送数据
{
BUS=BUS|ID;
}
static   bool   CD()//冲突检测
{
if(BUS==ID)
return   false;
else
return   true;
}
static   void   taskmain1(LPVOID   param)
{
int   i;
for(i=1;i <=20;i++)
printf( "%d\n ",i);
for(success=0;success <20;)
{
CS();
SendToBus();
if(!CD())
{
success++;
Sleep((DWORD)50);
printf( "ID   send   success\n主机A发送成功数=%d\n ",success);
BUS= '\0 ';
}
else
{
printf( "ID   send   conllision\n ");
}
}

}
void   StartTask()
{  
hThread=(HANDLE)_beginthread(taskmain1,sizeof(thred1)*20,NULL);
}  
private:
static   int   i;
static   int   ID;
static   int   success;
};  
int   thred1::i=0;
int   thred1::ID=1;
int   thred1::success=0;

class   thred2  
{  
public:  
thred2(int   a)
{
}
static   void   CS()//载波侦听
{
while(BUS!= '\0 ');//等待总线空闲
}
static   void   SendToBus()//发送数据
{

BUS=BUS|ID;
}
static   bool   CD()//冲突检测
{
if(BUS==ID)
return   false;
else
return   true;
}
static   void   taskmain1(LPVOID   param)
{
int   i;
for(i=1;i <=20;i++)
printf( "%d\n ",i);
for(success=0;success <20;)
{
CS();
SendToBus();
if(!CD())
{
success++;
Sleep((DWORD)50);
printf( "ID   send   success\n主机B发送成功数=%d\n ",success);
BUS= '\0 ';
}
else
{
printf( "ID   send   conllision\n ");
}
}

}
void   StartTask()
{  
hThread=(HANDLE)_beginthread(taskmain1,sizeof(thred2)*20,NULL);
}  
private:
static   int   i;
static   int   ID;
static   int   success;
};  
int   thred2::i=0;
int   thred2::ID=2;
int   thred2::success=0;

int   main(int   argc,   char*   argv[])
{
thred1   r1(1);
thred2   r2(2);
r1.StartTask();
r2.StartTask();
        for(;;);
return   0;
}

大致说明一下吧:建了2个完全一样的类thred1和thred2,只是类里面的静态变量ID不同。用来模范两个PC向总线BUS发送数据。但是当r1.StartTask()和r2.StartTask()开始线程之后,taskmain1函数里面的for(i=1;i <=20;i++)   printf( "%d\n ",i);会两个线程交替执行,但接下来的部分for(success=0;success <20;)循环不会交替执行。请问是什么原因?如何使之交替执行?

[解决办法]
多了Sleep引起的
[解决办法]
帮顶
[解决办法]
去掉sleep试试


[解决办法]
如果你为了让这两个线程公平的享受这个bus
static void taskmain1(LPVOID param)
{
int i;
for(i=1;i <=20;i++)
printf( "%d\n ",i);
for(success=0;success <20;)
{
CS();
SendToBus();
if(!CD())
{
success++;

printf( "ID send success\n主机B发送成功数=%d\n ",success);
BUS= '\0 ';
Sleep((DWORD)50);
}
else
{
printf( "ID send conllision\n ");
}
}

}
在sleep之前把bus重置.
你说的接下来的部分for(success=0;success <20;)循环不会交替执行,是因为出现交替的概率太小.还有最好在bus处理上设置关键段.避免出现莫名问题.
[解决办法]
OS怎么调度线程不是我们能干预的。
应该考虑同步。
[解决办法]
printf涉及到IO(屏幕IO),一般发生IO的情况下,通常操作系统会进行线程切换
而for(success=0;success <20;) 一段基本上纯粹CPU计算,不到时间片,通常不会被切换
[解决办法]
如同 justinm() 讲的
BUS没有被置位,就Sleep,一直占住了BUS信号,导致另一线程只能while()了

热点排行