多线程给出了一些奇怪的结果
Multi Threading gives some weird results
我只是使用了多线程。它可以工作,但它给出了一些奇怪的结果,每次我运行程序时,结果都不同。谁能告诉我我做错了什么
现在在我的输出中,我应该有 2 个块,它们不断上下移动,但在实际输出中,其他一些块突然出现,您可以在链接中看到我的输出
(即我从主代码中排除了全局字符数组,我正在添加另一个代码部分,以便您可以运行我的代码并帮助我(
主代码
#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',
};
当您输出到屏幕时,您有竞争条件。例如,如果线程 1 正在运行
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];
输出到当前光标,该游标位于不正确的位置。
要解决这个问题,你必须使用种族保护机制,正如πάντα ῥεῖ所说。像互斥锁这样的东西会起作用。
您有争用条件,因为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
}
// ...
}
}
}
// ...
在 while 条件下访问road
是一个问题。您可能不想在整个 while 循环周围放置一个lock_guard,因为在锁下花费的时间越少,线程之间的争用就越少,程序运行的速度就越快。
最简单的解决方案是引入局部变量,将值从数组复制到其中。这些是当前线程的本地(即独占(,因此不需要保护。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- C++ 多线程给出不同的结果
- 多线程合并选项的奇怪结果
- 多线程文件读取为每个线程生成相同的结果
- 在多线程工作负载上解释Gperftools的结果
- 与单线程相比,c++/java的多线程性能结果参差不齐
- 对多线程输入的QTableWidget进行基准测试,结果很奇怪
- Qthread多线程未预期结果
- 多线程给出了一些奇怪的结果
- 在linux CFS调度下的C/ c++多线程场景中出现意外结果