如何线程化函数?

时间:2017-09-01 14:01:10

标签: c++ multithreading

一个初学者的问题,但我该怎么做?

我有这段代码:

std::vector<std::thread*> threads[8];
for (unsigned short rowIndex = 0; rowIndex < unimportantStuff.rows; ++rowIndex)
{
    for (unsigned short columnIndex = 0; columnIndex < unimportantStuff.columns; ++columnIndex)
    {
        myModelInstance = new CModelInstance;
        myModelInstance->Init(myLoader.CreateTriangle(myFramework.myDevice, { -0.8f + unimportantStuff.offset*columnIndex, -0.8f + unimportantStuff.offset*rowIndex }), { -0.8f + unimportantStuff.offset*columnIndex, -0.8f + unimportantStuff.offset*rowIndex });
        myScene.AddModelInstance(myModelInstance);
    }
}

如果可能的话,我想要将Init函数和AddModelInstance函数都线程化,但是我不知道如何继续。如何激活多个线程(在这种情况下最多8个)?

我尝试使用这样的单个线程:

std::thread t1(myScene.AddModelInstance, myModelInstance);

但是我收到以下错误:

CScene :: AddModelInstance&#39 ;:非标准语法;使用&#39;&amp;&#39;创建指向成员的指针

我尝试添加&amp;功能和参数,但都没有奏效。

3 个答案:

答案 0 :(得分:4)

而不是:

std::thread t1(myScene.AddModelInstance, myModelInstance);

你需要这样的东西:

std::thread t1(&Scene::AddModelInstance, myScene, myModelInstance);

&Scene::AddModelInstance是一个指向你想要调用的成员函数的指针,它可能采用隐式this参数(myScene)。

答案 1 :(得分:0)

假设myScene属于Scene类型,请尝试以下操作:

std::thread t1(&Scene::AddModelInstance, &myScene, myModelInstance);

答案 2 :(得分:0)

干净直观的方法是使用lambda expressions

std::thread t1([&]() mutable {myScene.AddModelInstance(myModelInstance);});

请注意按引用或值进行捕获

作为旁注,请确保您的计划中没有data races