并行程序设计整理(三)—— Pthreads

2023-10-24 22:10

本文主要是介绍并行程序设计整理(三)—— Pthreads,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

共享内存程序 VS 分布式内存程序

共享内存程序

在共享内存程序中,变量可以是共享的,也可以是私有的。

共享变量可以被任何线程读写,私有变量通常只能被一个线程访问。线程之间的通信通常通过共享变量完成,因此此种方式下通信是隐式的。

动态线程

在这个范例中,通常有一个主线程,并且在任何给定时刻都有一个(可能是空的)工作线程集合。

主线程通常等待工作请求,当一个新的请求到达时,它会fork一个工作线程,该线程执行请求,当该线程完成工作时,它终止并加入主线程。

这种范例有效地利用了系统资源,因为线程所需要的资源只在线程实际运行时才会被使用。

静态线程

在这个范例中,在主线程进行任何必要的设置之后会fork出所有的线程,这些线程一直运行直到所有的工作完成。在线程加入主线程后,主线程可能会做一些清理(例如,释放内存),这样被fork出来的线程也会终止。

在资源使用方面效率较低,如果一个线程是空闲的,它的资源(例如,堆栈,程序计数器,等等)都不能被释放。

优点是,它更接近于最广泛使用的分布式内存编程范例。

线程安全

如果一个函数或库在被多个同时执行的线程调用时能够“正确”操作,那么它就是线程安全的。

由于多个线程通过共享内存进行通信和协调,因此线程安全代码会使用适当的同步来修改共享内存的状态。

Pthreads

POSIX: P ortable O perating S ystem I nterface for UNI X,是UNIX的可移植操作系统接口,提供操作系统实用程序的接口。

PThreads: POSIX线程接口。系统调用来创建和同步线程

PThreads支持创建并行性、同步,但不支持显式通信,因为共享内存是隐式的。

创建线程

pthread_create函数用来启动线程,其签名为:

int pthread_create(pthread_t* 				thread_p 				/* out */,const pthread_attr_t* 	attr_p 					/* in */,void* 					(*start_routine)(void*) /* in */,void* 					arg_p 					/* in */);

参数列表:

thread_p:指向某一个pthread_t对象。*⚠️注意:对象不是通过调用pthread create来分配的;它必须在调用之前分配。

attr_p:不会使用这个参数,函数调用中传递参数NULL

(*start_routine)(void*):线程要运行的函数。

arg_p:一个指针,指向应该传递给函数start_routine的参数。

返回值:大多数Pthreads函数的返回值表示函数调用中是否有错误。在这个函数中,如果创建操作失败,返回值将被设置为非零(nonzero)

终止线程

主线程为某一线程调用pthread_join函数来完成终止,函数签名为:

int pthread_join(pthread_t 	thread 		/* in */,void** 		ret_val_p 	/* out */);

thread:代表了一个pthread_t对象。

ret_val_p:接收由线程计算的任何返回值。

如果将主线程视为一条线,如下图所示,那么,当调用pthread_create时,主线程上会创建一个分支或分叉。对pthread_create的多次调用将导致多个分支或分叉。然后,当由pthread_create启动的线程终止时,这些分支会并入主线程。

在这里插入图片描述

一个例子

int main() {pthread_t threads[16];int tn;for(tn = 0; tn < 16; tn++) {pthread_create(&threads[tn], NULL, ParFun, NULL);}for(tn = 0; tn < 16; tn++) {pthread_join(threads[tn], NULL);}return 0;
}

在上面这段代码中,一共创建了 16 16 16个线程来执行函数ParFun

*⚠️注意:线程创建的成本很高,因此ParFun并行地做大量工作以分摊这些成本是很重要的。

关于共享数据的问题:

  • main函数外声明的变量是共享的
  • 在堆上分配的对象可以被共享(如需要共享可以通过指针传递)
  • 堆栈上的变量是私有的:将指向这些变量的指针传递给其他线程可能会导致问题。

Hello World

书上实例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>/* Global variable: accessible to all threads */
int thread_count;void* Hello(void* rank); /* Thread function */int main(int argc, char* argv[]) {long thread; /* Use long in case of a 64−bit system */pthread_t* thread_handles;/* Get number of threads from command line */thread_count = strtol(argv[1], NULL, 10);thread_handles = malloc (thread count*sizeof(pthread t));for (thread = 0; thread < thread_count; thread++)pthread_create(&thread handles[thread], NULL, Hello, (void*) thread);printf("Hello from the main thread\n");for (thread = 0; thread < thread_count; thread++)pthread_join(thread_handles[thread], NULL);free(thread_handles);return 0;
} /* main */
void* Hello(void* rank) {long my_rank = (long) rank;/* Use long in case of 64−bit system */printf("Hello from thread %ld of %dn\n", my_rank, thread_count);return NULL;
} /* Hello */

矩阵向量乘法

A = ( a i j ) A = (a_{ij}) A=(aij)是一个 m × n m\times n m×n的矩阵, x = ( x 0 , x 1 , ⋯   , x n − 1 ) T \textbf{x} = (x_0,x_1,\cdots,x_n-1)^T x=(x0,x1,,xn

这篇关于并行程序设计整理(三)—— Pthreads的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278092

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不