c ++在辅助std线程上运行代码

时间:2014-01-10 20:58:27

标签: c++ multithreading visual-studio-2012 windows-8 std

我在谷歌搜索了超过2个小时,但我找不到我的问题的答案:

我在Windows 8(x86)上使用c ++(visual studio express 2012)

我想在进程的主线程上运行我的worker std :: thread中的方法。我尝试使用他们的std :: thread :: id创建两个线程的引用,然后交换它们,但我无法创建引用。

从我的辅助线程调用以下方法:

[..]

void run(bool *running, thread::id _mainThreadId)
{
   while(*running)
   {  
        thread mainThread(_mainThreadId);
        thread thisThread(this_thread::get_id());
        thisThread.swap(mainThread);
        //mainThreads work:
        [..]
        thisThread.swap(mainThread);
        //thisThread again
   }
}

但是当我尝试编译我的项目时,会出现一个错误,显示构造函数线程(thread :: id)不存在。

我的问题:

有没有更好的方法在另一个线程上运行代码? 有没有办法使用它的id获取对线程的引用?

提前致谢!

PS: 对不起,如果有语法上的错误。我来自德国。 :)

3 个答案:

答案 0 :(得分:1)

每个线程就像一个顺序运行的程序,你不能让它任意跳转到程序的其他部分。

你要求的东西等同于启动另一个线程,可能暂停原始线程直到完成,并让这个新线程做你想做的事情。这是因为每个线程都有一个指令指针,告诉它它在哪里。每个线程也有寄存器和堆栈等。如果你想让一个线程做一些不同的事情你必须保存所有这些状态,做你的业务,然后恢复所有的状态。这相当于只创建一个新线程(操作系统将为您保存所有状态)。

可能值得问一下为什么要在另一个线程中运行方法。做出你要求的唯一方法是向另一个线程发送一条消息说"请用这些参数运行这个方法并给我结果",但这通常是没有意义的。如果您需要其他线程拥有的某种权限,则应该可以要求操作系统向您的线程授予这些权限。

答案 1 :(得分:0)

我实际上并没有得到你正在做的交换。如果你的目的是将执行权交给不同的线程,那么它不是这样做的:

创建线程时需要将指针传递给函数。该函数将在分离的线程中执行。如果你想等待它join到线程。您是否在thread文档中查看了示例?

答案 2 :(得分:0)

如果你想在另一个线程上运行某些东西,你需要将一些信息传递给另一个线程,以通知另一个线程。你不能“交换”线程希望某个东西在另一个线程上运行!

一种方法是为您的线程提供消息队列,您可以在其中发送作业,每个线程只是查看其消息队列并处理来自该队列的任何内容,例如:

int main() {
    SomeThreadEnabledQueue<std::function<bool()>> mainQueue;
    // kick of other threads possibly passing a pointer to the queue, etc.

    for (bool done(false); !done; ) {
        std::function<bool()> job = mainQueue.pop();
        done = job();
    }

    // join other threads, etc.
 }

您可以通过向mainQueue()添加适当的消息向您的主题发送合适的消息:

void run(std::atomic<bool> *running,
         SomeThreadEnabledQueue<std::function<bool()>>* queue) {
   while(*running)
   {
       // do whatever
       queue->push([=](){ /* what the other thread should do... */; return false; });
       // if necessary for the work to be completed, transfer a future and wait on it
   }
}

上述方法当然可以在特定线程上执行特定的工作项。但是,是否必须在特定线程上执行某些操作是个好主意。通常情况下,最好有一个线程池,并确保某些对象一次最多只能由一个线程运行。

请注意,我更改了running参数,该参数似乎是指向bool的指针,该指针在另一个线程中被更改为std::atomic<bool>:读取另一个线程中更改的值同步会创建数据争用,因此会产生未定义的行为。