我刚刚使用了多线程。它有效,但它给出了一些奇怪的结果,每次我运行程序时结果都不同。任何人都可以告诉我我做错了什么
现在在我的输出中,我应该有2个不断上下移动的块,但在实际输出中,其他一些块无处可见,你可以在link
看到我的输出(即我从主代码中排除了全局字符数组,我正在添加另一个代码段,以便您可以运行我的代码并帮助我)
主要代码
#include<iostream> //libraries
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<thread>
using namespace std;
void print();
void gotoxy(int,int);
int race();
void block1();
void block2();
COORD coord={0,0};//global variable
char road[22][80]={//haven't mentioned the array }; //global char array
void main()
{
race();
}
int race()
{
char swap;
//printing the array once
cout<<endl;
for(int i=0 ; i<22 ; i++)
{
for(int j=0 ; j<80 ; j++)
{
cout<<road[i][j];
}
}
thread t1 (block2);
thread t2 (block1);
t1.join();
t2.join();
getch();
return 0;
}
void block1() //definition of block1
{
char swap;
int i=1 , j=4;
while(!kbhit())
{
while(road[i+1][j]!='\xdb')
{
swap=road[i][j];
road[i][j]=road[i+1][j];
road[i+1][j]=swap;
gotoxy(4,i+1);
cout<<road[i][j];
gotoxy(4,i+2);
cout<<road[i+1][j];
Sleep(200);
i++;
}
if(road[i+1][j]=='\xdb')
while(road[i-1][j]!='\xdb')
{
swap=road[i][j];
road[i][j]=road[i-1][j];
road[i-1][j]=swap;
gotoxy(4,i);
cout<<road[i-1][j];
gotoxy(4,i+1);
cout<<road[i][j];
Sleep(500);
i--;
}
}
}
void block2() //definition of function block2
{
char swap;
int i=1 , j=7;
while(!kbhit())
{
while(road[i+1][j]!='\xdb')
{
swap=road[i][j];
road[i][j]=road[i+1][j];
road[i+1][j]=swap;
gotoxy(7,i+1);
cout<<road[i][j];
gotoxy(7,i+2);
cout<<road[i+1][j];
Sleep(50);
i++;
}
if(road[i+1][j]=='\xdb')
while(road[i-1][j]!='\xdb')
{
swap=road[i][j];
road[i][j]=road[i-1][j];
road[i-1][j]=swap;
gotoxy(7,i);
cout<<road[i-1][j];
gotoxy(7,i+1);
cout<<road[i][j];
Sleep(50);
i--;
}
}
}
全局字符数组
char road[22][80]={ //global char array
'\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb',
'\xdb','.','.','.','\xdb','.','.','\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb',1,'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','\xdb',
'\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb','\xdb',
};
答案 0 :(得分:2)
输出到屏幕时出现竞争条件。例如,如果第一个线程正在运行
gotoxy(4,i+1);
cout<<road[i][j];
并且执行在gotoxy(4,i+1);
之后切换到线程2。线程2然后自己做
gotoxy(7,i+1);
cout<<road[i][j];
输出光标的位置现在为(8,i + 1)。然后,当线程1再次运行时,它将使用cout<<road[i][j];
,它将输出到当前光标,该光标位于不正确的位置。
要解决这个问题,你必须使用种族保护机制,如πάνταῥεῖ所说。像互斥体这样的东西会起作用。
答案 1 :(得分:0)
您有竞争条件,因为road
在多个线程中被读取和写入。您需要在两个线程中保护对每个的数组访问权限。只有“打印一次数组”循环才能正常运行,因为它会在其他线程生成之前运行。
// global scope
std::mutex road_mx;
// ...
void block1() {
while //... {
// ...
while(road[i+1][j]!='\xdb') { // <-- problem, see below
{ // <-- scope for the lock guard
std::lock_guard<std::muxtex> lock(road_mx);
// do stuff with road
}
// ...
}
}
}
// ...
条件下中road
的访问权限是个问题。您可能不希望在 while 循环中放置 lock_guard ,因为在锁定下花费的时间越少,线程之间的争用越少,程序运行得越快。
最简单的解决方案是引入局部变量,将数组中的值复制到。那些是本地的 - 即排他性的 - 当前的线程,所以不需要保护。