在学校学过c++的一点皮毛,现在发现,stl是真心难。。不多说,进正题,C++如何运行并发的for循环。
需要用到并发的地方一般都涉及到性能,并发分为多线程并发和多进程并发。多线程并发一般来说系统的开销比多进程的要小,而多进程的整体性能一般是由于多线程的。
C++实现多线程并发
#include <iostream>
#include <vector>
#include <thread>
typedef void (*func)();
int atom;
void f1() { atom=1;printf("atom=%d\n",atom); }
void f2() { atom=2;printf("atom=%d\n",atom); }
void f3() { atom=3;printf("atom=%d\n",atom); }
int main()
{
std::vector<func> func_vec = { &f1, &f2, &f3 };
std::vector<std::thread> thread_vec;
for (func& f : func_vec)
thread_vec.emplace_back(std::thread(f));
for (std::thread& t : thread_vec)
t.join();
return 0;
}
个人倾向于用SourceInsight来看C++代码,写简单的C++代码直接在C++ shell跑就可以了,百度的C++在线编译不靠谱。可以看到上面的代码里面写了三个很简单的函数,希望这三个输出可以并发执行。所以创建了两个vector类型的变量,最后用std::thread.join()来实现并发。官方介绍如下:join函数在线程执行完成后返回None,这会使此函数返回的时刻与线程中所有操作的完成同步:这会阻止调用此函数的线程的执行,直到构造中调用的函数返回(如果尚未返回)。调用此函数后,线程对象变为不可连接,可以安全销毁。打比方我执行了100个这样的join,那么这100个线程会并发执行,但是像上面想要执行return 0的话需要等所有的线程执行完。
并发执行就没法确定顺序,我们可以多次运行查看结果是否符合预期。
可以看到上面运行结果是不同的,所以简单的多线程并发就实现了。但是这样的代码运行在c++工程里面是比较危险的,一般只是测试时用,因为涉及到线程安全和可重入等等。
C++实现多进程并发
这个准确的来说不是用C++实现的,可以用C++的fork实现,但是麻烦。在shell脚本里面
bash command1 &
bash command2 &
这个如果和for循环一起用加上wait函数,避免产生僵尸进程。