我在谷歌搜索了超过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: 对不起,如果有语法上的错误。我来自德国。 :)
答案 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>
:读取另一个线程中更改的值同步会创建数据争用,因此会产生未定义的行为。