【C++】多线程(四)

这是多线程的最后一篇文章。

std::promise

promise 的作用很简单,在一个线程t1中保存一个类型typename T的值,可供相绑定的std::future对象在另一线程t2中获取。事实上,它与future基本是成对出现的。来看下面的例子:

	//声明一个std::promise对象pr1,其保存的值类型为int
	promise<int> pr1;
	//声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
	future<int> fu1 = pr1.get_future();

promise和future之间是通过get_future()绑定的,对于一个promise而言,只能调用一次get_future()。

之后创建两个线程,线程1为promise赋值,线程2使用promise的值。

void Thread_Fun1(promise<int> &p)
{
   

	int iVal = 233;
	cout << "传入数据(int):" << iVal << endl;
 
	//传入数据iVal
	p.set_value(iVal);
}
 
void Thread_Fun2(future<int> &f)
{
   
	//阻塞函数,直到收到相关联的std::promise对象传入的数据
	auto iVal = f.get();		//iVal = 233
 
	cout << "收到数据(int):" << iVal << endl;
}
	//创建一个线程t1,将函数Thread_Fun1及对象pr1放在线程里面执行
	thread t1(Thread_Fun1, ref(pr1));
	//创建一个线程t2,将函数Thread_Fun2及对象fu1放在线程里面执行
	thread t2(Thread_Fun2, ref(fu1));
 
	//阻塞至线程结束
	t1.join();
	t2.join();

如果你对操作系统有一定的了解,你会发现,这有点像“生产者-消费者”问题,promise相当于生产者,future相当于消费者。

当然不能说promise的唯一意义就是让thread可以通过future传递一个返回值回来,反正有万能的引用。鉴于我公司的项目里对这个用得比较少,我也无法解释更多的含义了。

线程对自身的控制

thread所有针对自身的控制都在命名空间this_thread里,我这里介绍两个:

sleep_for

每次我学这种函数,我都有种无语的感觉。只是因为C语言的sleep()与平台有关,C++就要搞一个另外的sleep_for()出来,然后参数还是特别离谱的duraction,然后优点还是能保证底层以及多平台的兼容性… …唉。

说回正题,sleep_for()可以让线程暂停一段时间。比如刚才的函数就可以这么用:

void Thread_Fun1(promise<int> &p)
{
   
    this_thread::sleep_for(chrono::seconds(10));
	int iVal = 233;
	cout << "传入数据(int):" << iVal << endl;
 
	//传入数据iVal
	p.set_value(iVal);
}

yield

yield()的作用是当前线程“放弃”执行,让操作系统调度另一线程继续执行。当然不是永久放弃,而是暂时交出时间片供操作系统调度,过一会会还回来的。

比如你在等待某个操作完成,循环while会使得操作系统没办法分资源给等待的线程出现死锁。这时就可以用yield()暂时交出控制权。

while(!isDone()); // 错误的写法,有可能死锁
while(!isDone()) yield(); // 正确的写法,暂时交出控制权

相关推荐

  1. C++】线

    2023-12-27 22:36:02       39 阅读
  2. C++ 线

    2023-12-27 22:36:02       27 阅读
  3. C++ 线

    2023-12-27 22:36:02       19 阅读
  4. C#线

    2023-12-27 22:36:02       12 阅读
  5. C++ 线

    2023-12-27 22:36:02       12 阅读
  6. 线C#】

    2023-12-27 22:36:02       9 阅读
  7. C++()--线同步》

    2023-12-27 22:36:02       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-27 22:36:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-27 22:36:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-27 22:36:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-27 22:36:02       20 阅读

热门阅读

  1. 随笔笔记-2023

    2023-12-27 22:36:02       36 阅读
  2. 【ENGF0004】Mathematical Modelling and Analysis

    2023-12-27 22:36:02       30 阅读
  3. odoo17核心概念view2——view_service

    2023-12-27 22:36:02       29 阅读
  4. Centos设置IP地址方法

    2023-12-27 22:36:02       35 阅读
  5. Day02-ES6

    2023-12-27 22:36:02       31 阅读
  6. Kotlin 接口

    2023-12-27 22:36:02       34 阅读
  7. 14-网络安全框架及模型-分层防护模型

    2023-12-27 22:36:02       35 阅读
  8. python初试五

    2023-12-27 22:36:02       40 阅读