'_Thr = _Other._Thr;' 断点

Jon*_*ght 1 c++ multithreading

对于大多数错误,我经常会知道我需要朝哪个方向前进,但在这里我不知道.

那么让我们从断点本身开始:

在此输入图像描述

使用线程库的任何交互都是相对较少的,这里是所有这些:包含:

#include <thread>
Run Code Online (Sandbox Code Playgroud)

用法:

void evolve(double* bestN, double* bestP, double* bestM, double* bestQ, double* bestWinConstant) {

    std::thread threadArray[threadAmount];

    for (int i = 0; i < 100000; i++) {
        for (int t = 0; t < threadAmount; t++) {
            if (gameArrayInUse[t] == 0) {
                copyArray(gameArray[t], startArray);
                gameArrayInUse[t] = 1;
                threadArray[t] = std::thread(playGames, i, t);
                std::cout << "------------New Thread Spawned, No: " << t << std::endl;
                break;
            }
            if (t == threadAmount - 1) {
                t = -1;
            }
        }
    }

    for (int i = 0; i < threadAmount; i++)
    {
        std::cout << "JOIN THREADS--------------------------------------------------" << std::endl;
        threadArray[i].join();
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台中出现的错误(应注意每次更改):

Start of evolution on magnitude:1
------------New Thread Spawned, No: 0Completed:
0.000000%
------------New Thread Spawned, No: 1
Compl
Run Code Online (Sandbox Code Playgroud)

由于我对此缺乏了解,我很抱歉,如果你发现我提供的关于我的代码缺乏某些方面的内容,我会恳请你通过评论通知我,以便我可以修改它.

zne*_*eak 7

"断点"实际上由_STD terminate()上面的一行触发.(特别是在调试本机代码时,我发现看一下看起来无法解释时似乎导致错误的那一行是一种健康的习惯.)根据包装它的条件,当你在move一个线程顶部时触发它正在运行的现有线程

C++不允许您覆盖正在运行的线程对象.在运行循环的每次迭代之前for(i),应确保for(t)循环中创建的每个线程都已终止.你可以通过电话来做到这一点thread::join.或者,您可以调用thread::detach让线程独立运行而不需要代表它的对象,但您无法检查其完成情况.

您还必须确保在函数返回之前已完成每个线程,否则在运行thread对象被销毁时您将收到类似的错误.

  • 在这种情况下,程序应该使用[`thread :: joinable`](http://www.cplusplus.com/reference/thread/thread/joinable/)来检查插槽是否可用,而不是维护该状态.(如果`joinable()`返回true,则不可用.) (2认同)