Microsoft Visual C++实现主线程获取线程的退出码,std::thread thread_track = std::thread(& {track_thread(); }); thread_track.detach(); 如何使线程的返回值能够让主线程获取
时间: 2024-11-27 14:08:52 浏览: 2
c++CurrencyThreadMultiDevelopment.rar_thread_多线程 visual c++_线程 类
在Microsoft Visual C++中,当您使用`std::thread`创建一个新线程并希望从主线程获取其退出状态时,通常线程本身并不直接提供返回值,因为它们是非阻塞的。`detach()`函数将线程从当前工作线程分离出去,使得它独立运行,并不受主线程控制。
然而,如果线程需要向主线程传递一个结果,一种常见的做法是通过共享内存、条件变量、消息队列或者其他同步机制来进行通信。在这种情况下,可以考虑以下步骤:
1. **使用共享数据**: 创建一个全局或成员变量,在线程结束时设置这个变量作为返回值。例如:
```cpp
int exitCode;
void track_thread() {
// ... 线程逻辑
exitCode = someReturnValue; // 设置退出码
}
thread_track.join(); // 等待线程完成
```
2. **使用条件变量**: 主线程可以等待一个特定条件,当线程完成并设置退出码时,唤醒主线程并读取退出码。
```cpp
std::mutex mtx;
std::condition_variable cv;
int exitCode;
void track_thread() {
// ... 线程逻辑
std::lock_guard<std::mutex> lock(mtx);
exitCode = someReturnValue;
cv.notify_one();
}
thread_track.join();
std::unique_lock<std::mutex> lk(mtx);
cv.wait(lk, []{return exitCode != 0;}); // 当exitCode被设置时继续执行
```
3. **使用future和promise** (C++11及以上版本):这是一种更现代且推荐的方式,允许非阻塞地等待线程完成并获取结果。
```cpp
std::future<int> resultFuture;
void track_thread() {
resultFuture = std::async(std::launch::async, &track_thread_function, /*args*/);
}
int exitCode = resultFuture.get(); // 在join后阻塞直到线程完成并获取结果
```
以上三种方案都需要在适当的地方进行同步以防止数据竞争。记住,如果你只是简单地想要线程执行完就立即进行其他操作,那么`detach()`是合适的,但如果后续需要处理线程的结果,则需要采用某种形式的同步机制。
阅读全文