Multithreading 无线程并发的表示方法

Multithreading 无线程并发的表示方法,multithreading,programming-languages,multiple-languages,Multithreading,Programming Languages,Multiple Languages,我想知道在没有显式的线程对象的情况下如何表达并发性,而不是实现(可能会使用线程或线程池),而是语言设计相关的问题 问题1:我想知道如果没有线程对象,会丢失什么,在这样的语言中有什么不能完成 问题2:我还想知道这将如何表达,作为线程的替代品或补充,提出或实现了哪些方法?一种可能性是MPI编程模型(GPU也是如此) 假设您有以下代码 for(int i=0; i < 100; i++) { work(i); } 另一个解决方案是openMP库 这里您声明并行块。整个线程部分由库本身完

我想知道在没有显式的线程对象的情况下如何表达并发性,而不是实现(可能会使用线程或线程池),而是语言设计相关的问题

问题1:我想知道如果没有线程对象,会丢失什么,在这样的语言中有什么不能完成


问题2:我还想知道这将如何表达,作为线程的替代品或补充,提出或实现了哪些方法?

一种可能性是MPI编程模型(GPU也是如此)

假设您有以下代码

for(int i=0; i < 100; i++) {
    work(i);
}
另一个解决方案是openMP库 这里您声明并行块。整个线程部分由库本身完成

例如:

//this will split the for-loop automatically in 4 threads
#pragma omp parallel for num_threads(4)
for(int i=0; i < 100; i++) {
    work(i);
}
//这将自动将for循环拆分为4个线程
#用于num_线程的pragma omp并行(4)
对于(int i=0;i<100;i++){
工作(一);
}
最大的优点是,书写速度快。就这样 您可以通过自己编写线程获得更好的性能,
但是它需要更多的时间和关于同步的知识

一种可能是MPI程序模型(也包括GPU)

假设您有以下代码

for(int i=0; i < 100; i++) {
    work(i);
}
另一个解决方案是openMP库 这里您声明并行块。整个线程部分由库本身完成

例如:

//this will split the for-loop automatically in 4 threads
#pragma omp parallel for num_threads(4)
for(int i=0; i < 100; i++) {
    work(i);
}
//这将自动将for循环拆分为4个线程
#用于num_线程的pragma omp并行(4)
对于(int i=0;i<100;i++){
工作(一);
}
最大的优点是,书写速度快。就这样 您可以通过自己编写线程获得更好的性能,
但是它需要更多的时间和关于同步的知识

有很多方法来表达并发性,包括任务、参与者、并行循环、各种并行枚举等(这些只是我从C#中知道的)。我认为要列出它们的问题太广泛了。@svick可能,但我认为它并没有那么广泛。并行可枚举不是一个并行循环的特殊化吗?那么,并行可枚举不是循环并行化的一个脚注吗?有很多方法来表示并发性,包括任务、参与者、并行循环、各种并行可枚举等(这些只是我从C#知道的)。我认为,要求列出它们的问题太广泛了。@svick可能,但我认为它并没有那么广泛。并行可枚举不是一个并行循环的特殊化吗?那么并行可枚举不是循环并行化的一个脚注吗?
int rank = get_core_id();
int size = get_num_core();
int data[100];
int result;
int results[size];
if (rank == 0) { //master-core only
   fill_with_stuff(data);
}
scatter(0, data); //core-0 will send the data-content to all other cores
result = work(rank, data); // every core works on the same data
gather(0,result,results); //get all local results and store them in 
                          //the results-array of core-0
//this will split the for-loop automatically in 4 threads
#pragma omp parallel for num_threads(4)
for(int i=0; i < 100; i++) {
    work(i);
}