使用std::promise
直接看std::promise
如何使用吧。(《并发编程》这段实在太抽象直接跳过吧。。。)我们用std::promise<bool>
和std::future<bool>
来标识一块数据是否成功传输。
#include <future>
void proces_connections(connection_set& connections)
{
while(!done(connections))
{
for(connection_iterator connection = connections.begin(), end = connections.end(); connections !=
end; ++connections)
{
if(connection->has_in_comming_data())
{
data_packet data = connection->incoming();
std::promise<payload_type>& p = connection->get_promise(data.id);
p.set_value(data.payload);
}
if(connection->has_outgoing_data())
{
outgoing_packet data = connection->top_of_outgoing_queue();
connection->send(data.payload);
data.promise.set_value(true);
}
}
}
}
这段太抽象,不想讲解了。。。直接看CSDN的代码吧:
#include <iostream>
#include <future>
#include <chrono>
void Thread_Fun1(std::promise<int> &p)
{
//为了突出效果,可以使线程休眠5s
std::this_thread::sleep_for(std::chrono::seconds(5));
int iVal = 233;
std::cout << "传入数据(int):" << iVal << std::endl;
//传入数据iVal
p.set_value(iVal);
}
void Thread_Fun2(std::future<int> &f)
{
//阻塞函数,直到收到相关联的std::promise对象传入的数据
auto iVal = f.get(); //iVal = 233
std::cout << "收到数据(int):" << iVal << std::endl;
}
int main()
{
//声明一个std::promise对象pr1,其保存的值类型为int
std::promise<int> pr1;
//声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
std::future<int> fu1 = pr1.get_future();
//创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行
std::thread t1(Thread_Fun1, std::ref(pr1));
//创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行
std::thread t2(Thread_Fun2, std::ref(fu1));
//阻塞至线程结束
t1.join();
t2.join();
return 1;
}
控制台会在5秒后输出:
传入数据(int):233
收到数据(int):233
main
函数中,先通过get_future
获取与std::promise
绑定的future
对象。随后分别启动两个线程,分别传入promise
和future
。线程1在休眠5秒后调用set_value()
设置promise
的值,future
将会变为就绪,随后一直处于阻塞的线程2可以调用get()
获取值。
最后一次更新于2022-07-23
0 条评论