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 ( & parallel_quick_sort< T> , move ( lower_part) ) ) ;
future< list< T>> new_higher ( async ( & parallel_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的思想很简单,如果没有共享数据,则每一个线程可以完全独立的运行; 只需要基于它对所接收到的信息如果进行反映 由于线程天生就是共享全局数据的,所以程序员必须保证: 不会在线程之间共享数据,只在线程之间共享消息队列, 既然要有这种封装性,就可以封装成类 很可能会使用状态机的思想 不同的角色对应不同的线程,成为角色模型