C++学习(21)

#学习自用#

namespace

名称空间主要目的是避免命名冲突,假如我们有两个名字同为 print 的函数,传入参数都是char*,一个函数功能是打印字符串,另一个函数功能是反转后打印。C中的做法是改变函数名称,一个用print,另一个用reverse_print,C++中的做法就是使用不同的空间名称(这里因为形参类型相同所以不能用函数重载)。

#include<xutility>
#include<iostream>
#include<string>
using namespace std;
namespace apple {
	void print(const char* text)
	{
		cout << text << endl;
	}
}
namespace orange {
	void print(const char* text)
	{
		string temp = text;
		reverse(temp.begin(),temp.end());
		cout << temp << endl;
	}
}

int main()
{
	const char* A = "abcd";
	apple::print(A);
	orange::print(A);

	cin.get();
}

线程

我们之前所有的代码都是单线程的,意思是我们只让计算机一次做一行代码或一条指令,每当代码中有cin之类的命令,程序运行到此处就会等待用户输入,这时候程序就像被阻塞了,不会继续运行。当代码体积很大时,某些待执行语句并不需要用户此次的输入,这种等待就会很浪费时间。

#include<thread>
#include<iostream>
using namespace std;

static bool s_finished = false;
void Dowork()//工作线程中执行的内容
{
	
	while (!s_finished)
	{
		
		cout << "working\n";
		
	}
}

int  main()
{
	thread worker(Dowork);//同时执行工作线程
	cin.get();
	s_finished = true;

	worker.join();//工作线程结束后再进行下面的主线程

	cin.get();
}

这里通过两个线程(主线程和工作线程)实现了,不断打印内容的同时等待用户输入回车来终止打印,这是单靠函数无法实现的,因为在单一线程中会在cin.get()处阻塞。这里我尝试将worker.jion()注释掉,在我按了回车之后依旧输出了一行working才停下并且在调试结束时发生了错误abort() has been called,我查了一下说是同步的问题,当主线程改变s_finished时,工作线程并没有立即看到新的值。所以我在注释掉这条语句的情况下,在工作线程语句中添加了sleep_for,让循环慢下来,这次按下回车后没有多余的working被打印,可是依旧报错。这里我感觉应该不是工作线程没有看到s_finished的改变,因为没有多余的输出,这里留个坑,想不到合理的解释,因为worker.join()的作用也只是等待worker线程结束再进行它下面的主线程的语句,然而多线程本来就可以并行运行,总不可能是worker还没结束运行就运行主线程导致的错误吧。

  • 22
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值