c++ - 多线程给出了一些奇怪的结果

标签 c++ multithreading

我刚刚使用了多线程。它有效,但它给出了一些奇怪的结果,每次我运行该程序时结果都不同。谁能告诉我我做错了什么

现在在我的输出中,我应该有 2 个连续上下移动的 block ,但在实际输出中,一些其他 block 突然出现,您可以在 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',


                        };

最佳答案

当你输出到屏幕时,你有一个竞争条件。例如,如果线程一正在运行

        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];它将输出到当前光标,它在不正确的位置。

要解决此问题,您必须使用种族保护机制,正如 πìντα ῥεῖ 所说。像互斥量这样的东西会起作用。

关于c++ - 多线程给出了一些奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40571817/

相关文章:

python - 将线程模块与 atexit 处理程序一起使用时出现异常 KeyError : KeyError(139697538152192, )

java多线程-子线程不会立即启动

multithreading - Python在休眠时终止线程

c++ - 如何在boost asio下将serial_port flow_control设置为none以外的值

python - 通过 Cython 将 C++ vector 传递给 Numpy,无需自动复制和处理内存管理

c++ - 获取矩阵错误 cin>>

c++ - 如何衡量和修复上下文切换瓶颈?

c# - .NET 中的多线程 - 在后台实现计数器

c++ - std::move a const std::vector in a lambda capture

c++ - Qt串口通信