#学习自用#
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还没结束运行就运行主线程导致的错误吧。