std::thread::_State
时间: 2023-09-15 09:15:04 浏览: 44
std::thread::_State是C++标准库中std::thread类的私有嵌套类型之一。它代表了std::thread对象的内部状态。通过_State,std::thread对象可以跟踪和管理底层线程的状态和行为。具体来说,_State用于保存线程的执行状态,包括线程是否已启动、是否可被加入和分离等信息。在std::thread对象的生命周期中,_State的状态会发生变化以反映底层线程的执行情况。但是请注意,由于_State是私有类型,我们不能直接访问或操作它。我们只能通过std::thread提供的公共接口来间接操作_State。
相关问题
'std::thread::_State_impl<std::thread::_Invoker<std::tuple<ThreadPool::ThreadPool (int):: (lambda()#1}> > > warning: RTTI symbol not found for class
这个问题看起来是一个编译器的警告。RTTI(Run-Time Type Information)是一种C++的特性,它允许程序在运行时获取对象的类型信息。这个警告的意思是,在编译时无法找到某个类的RTTI符号,可能会导致程序在运行时出现问题。
通常情况下,这个警告可以通过在编译选项中添加-fno-rtti来忽略掉。不过,这样做会导致某些类型安全的代码无法正常工作,因此需要谨慎使用。另外,也可以通过在类定义中添加虚函数来解决这个问题,因为虚函数会自动添加RTTI符号。
如果你需要更具体的帮助,可以提供更多的上下文信息,我会尽力帮你解决问题。
rust实现std::promise
Rust没有内置的std :: promise类,但是可以使用Rust的Future和async / await语法来实现类似的功能。
一个可能的实现如下:
```rust
use std::sync::{Arc, Mutex};
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
use std::cell::UnsafeCell;
struct Promise<T> {
state: Arc<Mutex<State<T>>>,
}
impl<T> Promise<T> {
fn new() -> (Self, FuturePromise<T>) {
let state = Arc::new(Mutex::new(State::Pending));
let promise = Promise { state: state.clone() };
let future = FuturePromise { state };
(promise, future)
}
fn set_value(&self, value: T) {
let mut state = self.state.lock().unwrap();
match *state {
State::Pending => {
*state = State::Resolved(value);
}
_ => panic!("Promise already resolved"),
}
}
fn set_error(&self, error: String) {
let mut state = self.state.lock().unwrap();
match *state {
State::Pending => {
*state = State::Rejected(error);
}
_ => panic!("Promise already resolved"),
}
}
}
enum State<T> {
Pending,
Resolved(T),
Rejected(String),
}
struct FuturePromise<T> {
state: Arc<Mutex<State<T>>>,
}
impl<T> Future for FuturePromise<T> {
type Output = Result<T, String>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let mut state = self.state.lock().unwrap();
match &mut *state {
State::Pending => Poll::Pending,
State::Resolved(value) => {
let value = std::mem::replace(value, unsafe { std::mem::uninitialized() });
Poll::Ready(Ok(value))
}
State::Rejected(error) => {
let error = std::mem::replace(error, unsafe { std::mem::uninitialized() });
Poll::Ready(Err(error))
}
}
}
}
unsafe impl<T> Send for Promise<T> {}
unsafe impl<T> Sync for Promise<T> {}
unsafe impl<T> Send for FuturePromise<T> {}
unsafe impl<T> Sync for FuturePromise<T> {}
fn main() {
let (promise, future) = Promise::new();
let handle = std::thread::spawn(move || {
std::thread::sleep(std::time::Duration::from_secs(1));
promise.set_value(42);
});
let result = futures::executor::block_on(future);
handle.join().unwrap();
println!("{:?}", result);
}
```
这个实现使用了Arc,Mutex和UnsafeCell来实现线程安全的状态共享。FuturePromise实现了Future trait,它持有一个Mutex来保护状态。在poll方法中,它首先获取Mutex的锁,然后检查状态是否已经解决。如果状态是Pending,则返回Pending,否则返回Ready结果,同时从状态中提取值或错误。Promise实现了set_value和set_error方法,它们分别将状态设置为Resolved或Rejected状态,并在状态已经解决时抛出错误。在main函数中,我们创建一个Promise和FuturePromise对,并使用线程来解决Promise。最后,我们使用futures :: executor :: block_on函数等待FuturePromise结果,并打印它。