第一个线程
#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()
中创建线程,但这只会带来更多问题。
答案 0 :(得分:0)
对不起,但是我认为,鉴于存在潜在的种族危险,即dir,x,y的存储位置既不是独立的也不是原子的,您可能无法实现的目标。因此,您的程序可能无法按预期运行。可能的解决方法是将其设置为全局变量(线程本地存储/ TLS也存在此问题),然后设置信号量以控制访问顺序,或者使其本质上是顺序但异步的(因此,请还原此错误离散系统恢复为连续流动。
答案 1 :(得分:0)
发现了。必须使用。 std :: ref() 例如:
std::thread movement(changeDir, std::ref(dir));