FP
#include <list>
#include <iostream>
#include <algorithm>
#include <future>
using namespace std;
template<typename T>
list<T> sequential_quick_sort(list<T> input)
{
if(input.empty())
{
return input;
}
list<T> result;
result.splice(result.begin(),input,input.begin());
const T &pivot = *result.begin();
auto divide_point = partition(input.begin(),input.end(),[&](const T &t){
return t < pivot;
});
list<T> lower_part;
lower_part.splice(lower_part.end(),input,input.begin(),divide_point);
auto new_lower(sequential_quick_sort(move(lower_part)));
auto new_higher(sequential_quick_sort(move(input)));
result.splice(result.end(),new_higher);
result.splice(result.begin(),new_lower);
return result;
}
template<typename T>
list<T> parallel_quick_sort(list<T> input)
{
if(input.empty())
{
return input;
}
list<T> result;
result.splice(result.begin(),input,input.begin());
const T &pivot = *result.begin();
auto divide_point = partition(input.begin(),input.end(),[&](const T &t){
return t<pivot;
});
list<T> lower_part;
lower_part.splice(lower_part.begin(),input,input.begin(),divide_point);
future<list<T>> new_lower(async(¶llel_quick_sort<T>,move(lower_part)));
future<list<T>> new_higher(async(¶llel_quick_sort<T>,move(input)));
result.splice(result.end(),new_higher.get());
result.splice(result.begin(),new_lower.get());
return result;
}
int main()
{
list<int> t{2,34,4,1,5,63,3,24,5,6};
list<int> value = parallel_quick_sort(t);
for (auto &&i : value)
{
cout << i << " ";
}
cout << endl;
exit(0);
}
CSP
- CSP基于消息传递的同步操作
- CSP的思想很简单,如果没有共享数据,则每一个线程可以完全独立的运行;
- 只需要基于它对所接收到的信息如果进行反映
- 由于线程天生就是共享全局数据的,所以程序员必须保证:
- 不会在线程之间共享数据,只在线程之间共享消息队列,
- 既然要有这种封装性,就可以封装成类
- 很可能会使用状态机的思想
- 不同的角色对应不同的线程,成为角色模型