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

时间:2016-11-13 08:10:16

标签: c++ multithreading

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

现在在我的输出中,我应该有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',


                        };

2 个答案:

答案 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 ,因为在锁定下花费的时间越少,线程之间的争用越少,程序运行得越快。

最简单的解决方案是引入局部变量,将数组中的值复制到。那些是本地的 - 即排他性的 - 当前的线程,所以不需要保护。