uli*_*ess 1 c++ multithreading stdthread
我正在尝试在C++ 11之上构建一个线程安全层,std::thread其中每个对象都被分配给一个拥有的线程,并且某些调用在错误的线程上使用时会引发硬错误.拥有线程是唯一可以将对象传输到另一个线程的线程.
我已经完成了所有工作,除了thread::id在实际运行之前我找不到获取线程的方法.我需要先将新线程的ID附加到对象上,然后再将其移除.
如果我使用
std::thread newThread( [theObject]()
{
// use theObject here.
} );
Run Code Online (Sandbox Code Playgroud)
我可以获得线程ID的最早点是在线程对象的定义之后,此时线程已经在运行.
我看到有一个默认的构造函数std::thread,但我看不到有办法给它一个函数来在线程上运行.
有没有办法在线程上执行两步构造,或者在创建时控制线程的ID?
在开始运行之前,您可以考虑让线程执行的函数在起飞前进行一些初始设置,而不是获取线程的ID.例如,你可以这样做:
bool isReady = false;
bool wasReceived = false;
std::mutex mutex;
std::condition_variable condition;
std::thread newThread([theObject, &isReady, &mutex, &condition] {
/* Wait until we've been cleared to go. */
std::unique_lock<std::mutex> lock(isReady);
condition.wait(lock, [&isReady] { return isReady; });
/* Signal that we're done. */
wasReceived = true;
lock.unlock();
condition.notify_one();
/* Put code here to do whatever it is that the thread should do. */
});
/* Read the thread's ID. It's currently waiting for us. */
auto id = newThread.get_id();
/* Tell the thread that we're ready for it. */
std::unique_lock<std::mutex> lock(mutex);
isReady = true;
condition.notify_one();
/* Wait until the thread has confirmed that it's ready. */
condition.wait(lock, [&] { return wasReceived; });
Run Code Online (Sandbox Code Playgroud)
这将创建线程并让它坐下等待,直到创建者有机会读取其ID.一旦发生这种情况,创建者就会等待,直到线程确认它已准备就绪,然后从那里你可以使用线程ID,但是你想要.
注意上面代码中的错误 - 它完全没有经过测试.:-)
不 - 一旦你创建一个线程,它就会开始运行.如果你想在它(大部分)之前得到它的ID,你可能想要创建一个小包装器,你传递线程(例如)一个CV和一个存放其输出的队列.
然后,当线程启动时,它会检索自己的ID,将其存放在输出队列中,然后等待CV.当父母已经检索到ID并准备让孩子开始做某事时,它会发出CV信号,然后关闭它.
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |