在多线程应用程序中修改对象

时间:2019-11-22 11:23:35

标签: c++ multithreading

第一个线程

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <thread>

void changeDir(int&dir)
{
    switch (getch()) {
    case 'a':
        dir = 1;
        break;
    case 'd':
        dir = 2;
        break;
    case 'w':
        dir = 3;
        break;
    case 's':
        dir = 4;
        break;
    }
}

第二线程

void coreGame(int&dir,int&x,int&y)
{
    switch (dir) {
    case 1:
        x--;
        break;
    case 2:
        x++;
        break;
    case 3:
        y--;
        break;
    case 4:
        y++;
        break;
    }
}

启动线程的主要功能

game()
{
    int x = 13;
    int y = 23;
    int dir = 0;

    std::thread movement(changeDir, dir);
    std::thread theRest(coreGame, dir,x,y);

    while (true) {
        if (movement.joinable()) {
            movement.join();
        }
        if (theRest.joinable()) {
            theRest.join();
        }
    }
}

为什么qtcreator在此方面给我错误。编译器拒绝告诉我哪行是不正确的,相反,当我尝试编译时,它只会给我错误。

我尝试在此之上定义什么也不做的功能。我也尝试过在main()中创建线程,但这只会带来更多问题。

2 个答案:

答案 0 :(得分:0)

对不起,但是我认为,鉴于存在潜在的种族危险,即dir,x,y的存储位置既不是独立的也不是原子的,您可能无法实现的目标。因此,您的程序可能无法按预期运行。可能的解决方法是将其设置为全局变量(线程本地存储/ TLS也存在此问题),然后设置信号量以控制访问顺序,或者使其本质上是顺序但异步的(因此,请还原此错误离散系统恢复为连续流动。

答案 1 :(得分:0)

发现了。必须使用。 std :: ref() 例如:

std::thread movement(changeDir, std::ref(dir));