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

C++ c++;在辅助std线程上运行代码,c++,multithreading,visual-studio-2012,windows-8,std,C++,Multithreading,Visual Studio 2012,Windows 8,Std,我在谷歌上搜索了2个多小时,但找不到问题的答案: 我在Windows 8(x86)(VisualStudio Express 2012)上使用C++ 我想从进程的主线程上的worker std::thread运行一个方法。我试图使用两个线程的std::thread::id创建它们的引用,然后交换它们,但是我无法创建引用 从我的辅助线程调用以下方法: [..] void run(bool *running, thread::id _mainThreadId) { while(*runnin

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

我在Windows 8(x86)(VisualStudio Express 2012)

上使用C++ 我想从进程的主线程上的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获取对线程的引用

提前谢谢

附言:
抱歉,如果有语法错误。我来自德国。:)

我不明白你在做什么。如果您的意图是将执行转移到不同的线程,那么这与执行方式无关:


在创建线程时,需要传递一个指向函数的指针。此函数将在单独的线程中执行。如果您想等待它,请
加入该线程。您是否查看了文档中的示例?

每个线程就像一个按顺序运行的程序,您不能随意将其跳转到程序的其他部分

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


也许值得一问,为什么要在另一个线程中运行一个方法。完成您要求的任务的唯一方法是向另一个线程发送一条消息,说“请使用这些参数运行此方法并给出结果”,但这通常是毫无意义的。如果您需要另一个线程拥有的某种权限,应该可以请求操作系统授予您的线程这些权限。

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

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

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.
 }
上述方法当然适用于在特定线程上执行特定的工作项。不过,必须在特定线程上执行某些操作是否是一个好主意是另一个问题。通常,最好有一个线程池,并确保某些对象一次最多由一个线程运行


请注意,我将
running
参数更改为
bool
,该参数在另一个线程中更改为
std::atomic
:在不同步的情况下读取另一个线程中更改的值会创建数据争用,从而导致未定义的行为。

好的,谢谢。我认为它会是这样的,但是在java中,你可以很容易地C++向主线程发布一个代码,所以我认为C++也有可能:)@ USS3183356,我不太确定你在指什么。据我所知,您唯一的选择是在java中启动一个新的线程,C++一样。你能为你所说的提供一个资源吗?对不起,我指的是Android的活动类(runOnUiThread)。我上次使用它已经有一段时间了。啊,好吧,你现在谈论的是一个特定的框架。UI有些特殊,因为有时需要在UI线程上执行操作以确保一致性。这几乎肯定是通过向UI发送描述所需调用的信息并要求其执行操作来实现的。UI有一些任务队列,当它可以处理它时,它将运行您的代码(重要的部分是它不一定会立即执行)。据我所知,对于任务队列来说,没有一个标准的C++构造。
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
   }
}