简单多线程程序的问题
#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()了