首页 > 其他分享 >第四章学习笔记

第四章学习笔记

时间:2023-12-17 21:11:42浏览次数:28  
标签:thread void printf 笔记 学习 线程 pthread 第四章 row

@

目录

一、学习笔记

1.并行计算导论

Linux 环境中有很多应用程序和很多进程,其中最重要的是客户端网络/服务器。 多进程服务器是指当客户端发出请求时,服务器使用子进程来处理客户端的请求。 父进程继续等待来自其他客户端的请求。 这种方法的优点是服务器可以在客户端请求时管理客户端,特别是在交互式客户端/服务器系统中。 对于 TCP 服务器,客户端和服务器之间的连接可能不会立即关闭。 客户端发送数据后可以关闭连接。 在此期间,服务器端进程被阻塞,操作系统可能会设置其他计划。 此时的客户服务流程。 与循环服务器相比,该服务的性能得到了显着提高。
1.1顺序算法与并行算法
顺序算法:begin-end代码块列出算法。可包含多个步骤,所有步骤通过单个任务依次执行,每次执行一个步骤,全执行完,算法结束。
begin
step_1
step_2
···
step_n
end
并行算法:cobegin-coend代码块来指定独立任务,所有任务都是并行执行的,紧接着代码块的下一个步骤将只在所有这些任务完成之后执行。
cobegin
task_1
task_2
···
task_n
coend
1.2并行性与并发性
通常,并行算法只识别可并行执行的任务,但是它没有规定如何将任务映射到处理组件。在理想情况下,并行算法中的所有任务都应该同时实时执行。然而,真正的并行执行只能在有多个处理组件的系统中实现,比如多处理器或多核系统。在单 CPU 系统中,一次只能执行一个任务。在这种情况下,不同的任务只能并发执行、即在逻辑上并行执行。在单CPU系统中,并发性是通过多任务处理来实现的。

2.线程

2.1线程的原理
简单来说,线程是某进程同一地址空间上的独立执行单元。
2.2线程的优点,缺点
优点:
(1)线程创建和切换速度更快
(2)线程的响应速度更快
(3)线程更适合并行计算
缺点:
(1)由于地址空间共享,线程需要来自用户的明确同步。
(2)许多库函数可能对线程不安全。通常,任何使用全局变量或依赖于静态内存内容的函数,线程都不安全。
(3)在单CPU系统上,使用线程解决问题实际上要比使用顺序程序慢

3.线程操作

线程的执行轨迹与进程类似。线程可在内核模式或用户模式下执行。
内核模式:对内核进行系统调用,变为挂起、激活以继续执行等。
用户模式:线程在进程的相同地址空间中执行,每个线程都有自己的堆栈。

4.线程管理函数

4.1创建线程
pthread_create函数。如下:
pthread_create(thread, attr, function, arg): create thread
pthread_exit(status) : terminate thread
pthread_cancel(thread) : cancel thread
pthread_attr_init(attr) : initialize thread attributes
pthread_attr_destroy(attr): destroy thread attribute
4.2线程ID
一种不透明的数据类型,取决于实现情况
int pthread_equal(pthread_t t1, pthread_t t2);//比较线程ID
4.3线程终止
线程函数结束后,即终止。
void pthread_exit(void *status);//返回值:0退出值表示正常终止,非0值表示异常终止
4.4线程连接
int pthread_join(pthread_t thread, void **status_ptr);//终止线程的退出状态以status_ptr返回

5.线程实例程序(见实践过程及截图)

6.线程同步

当多个线程试图修改同一共享变量或数据结构时,如果修改结果取决于线程的执行顺序,则称之为竞态条件。在并发程序中,绝不能有竞态条件。
6.1互斥量
在Pthread中,互斥量也被称为“锁”,意为互相排斥。允许执行实体仅在有锁的情况下才能继续执行的同步工具。
静态方法:
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER
动态方法:使用pthread_mutex_init()函数
6.2死锁预防
互斥量使用封锁协议,如果某线程不能获取互斥量,就会被阻塞,等待互斥量解锁后再继续,然后死锁就发生了,死锁是一种状态,许多执行实体相互等待,都无法继续下去。
有多种方法可以解决死锁问题:死锁预防、死锁规避、死锁检测和恢复等。
6.3条件变量
提供了一种线程协作的方法
静态方法:
pthread_cond_t con = PTHREAD_COND_INITIALIZER
6.4信号量
是一种数据结构,必须使用一个初始值和一个空等队列进行初始化。从执行实体的角度来看,对信号量的操作都是原子操作或基本操作。
6.5屏障
线程连接操作允许某线程等待其他线程终止,在Pthread中,可以采用的机制是屏障以及一系列屏障函数。
6.6Linux中的线程
Linux不区分线程和进程,它们都是由clone()系统调用创建的。

二、苏格拉底挑战

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、实践过程及截图

实践代码:

include <stdio.h>

include <stdlib.h>

include <pthread.h>

define N 4

int A[N][N],sum[N];

void *func(void arg)
{
int j,row ;
pthread_t tid = pthread_self();
row = (int)arg;
printf("Thread %d [%lu] computes sum of row %d\n",row,tid,row);
for(j=0;j<N; j++)
sum[row] += A[row][j];
printf("Thread %d [%lu] done:sum [%d] =%d\n",row,tid,row,sum[row]);
pthread_exit ((void
)0);
}
int main(int argc, char *argv[])
{
pthread_t thread[N];
int i,j,r,total = 0;
void status;
printf("Main: initialize A matrix\n");
for(i=0; i<N;i++){
sum[i] = 0;
for(j=0;j<N;j++){
A[i][j]=i
N+j+1;
printf("%4d ",A[i][j]);
}
printf( "\n" );
}
printf ("Main: create %d threads\n",N);
for(i=0;i<N;i++) {
pthread_create(&thread[i],NULL,func,(void *)i);
}
printf("Main: try to join with thread\n");
for(i=0; i<N; i++) {
pthread_join(thread[i],&status);
printf("Main: joined with %d [%lu]: status=%d\n",i,thread[i],
(int)status);
}
printf("Main: compute and print total sum:");
for(i=0;i<N;i++)
total += sum[i];
printf ("tatal = %d\n",total );
pthread_exit(NULL);
}
实践过程:
在这里插入图片描述

四、问题及解决方式

error: conflicting types for ‘qsort’; have ‘void *(void *)’
在这里插入图片描述

标签:thread,void,printf,笔记,学习,线程,pthread,第四章,row
From: https://www.cnblogs.com/ZZk15079494877/p/17794465.html

相关文章

  • 第十四章学习笔记
    @目录一、学习笔记1.MySQL简介2.安装MySQL3.使用MySQLmysql>SHOWDATABASES;二、苏格拉底挑战三、实践过程及截图include<stdio.h>include<my_global.h>include<mysql.h>include<stdio.h>include<stdlib.h>include<my_global.h>include<mysql.h>四、问题与......
  • 第十三章学习笔记
    @目录一、学习笔记1.TCP/IP协议2.IP主机和IP地址3.IP协议4.IP数据包格式5.路由器6.UDP7.TCP8.端口编号9.网络和主机字节序10.TCP/IP网络中的数据流二、苏格拉底挑战三、实践过程及截图include<stdio.h>include<stdlib.h>include<string.h>include<sys/socket.h>include......
  • STM32学习笔记_PWM驱动舵机和直流电机(4)
    STM32驱动舵机:舵机接线图:将PWM脚接在开发板PA1处;新建舵机模块:分析舵机的PWM信号:在一个周期20ms的脉冲信号上,高电平占空比为0.5ms-2.5ms分别对应着0°-180°。计算PWM的参数信息:PSC为72,ARR为20K,这样就得到一个频率周期为50Hz的信号。其中20KHz等于20ms,将CCR设置为500即=0.5ms的占空......
  • openGauss学习笔记-163 openGauss 数据库运维-备份与恢复-导入数据-使用COPY FROM STD
    openGauss学习笔记-163openGauss数据库运维-备份与恢复-导入数据-使用COPYFROMSTDIN导入数据-简介163.1关于COPYFROMSTDIN导入数据用户可以使用以下方式通过COPYFROMSTDIN语句直接向openGauss写入数据。通过键盘输入向openGauss数据库写入数据。详细请参见COPY。通过......
  • 2023-2024-1 20231425《计算机基础与程序设计》第十二周学习总结
    2023-2024-120231425《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1计算机基础与程序设计第十二周作业)这个作业的目标自学《计算机科学概论》第17章,《C语......
  • 2023-2024-1 20231304 《计算机基础与程序设计》第十二周学习总结
    2023-2024-120231304《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十二周作业这个作业的目标《C语言程序设计》第11章并完成云班课测试作业......
  • 学期 2023-2024-1 20232326《网络空间安全导论》第六周学习总结
    教材学习内容总结教材学习中的问题和解决过程问题1:挑战应答认证协议为什么可以对抗重放攻击?问题1解决方案:百度得知挑战应答认证协议可以对抗重放攻击的原因是因为它引入了挑战和应答的机制。在该协议中,服务端会向客户端发送一个随机的挑战值,客户端必须通过对挑战值进行加密......
  • 2023-2024-1 20231303 《计算机基础与程序设计》赵泊瑄第十二周学习总结
    2023-2024-120231303《计算机基础与程序设计》赵泊瑄第十二周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接https://i.cnblogs.com/posts/edit)这个作业的目标总结第十二周学习收获作业正文2023-......
  • 2023-2024-1 20231306 《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十二周作业这个作业的目标无作业正文https://www.cnblogs.com/zwywuhu/p/17908748.html教材学习内容总结《C语言程序设计》——第十......
  • 20232413《网络》第六周学习总结
    教材学习内容总结教材学习中的问题和解决方案问题一:跨站脚本攻击(XSS)解决方案: 对用户输入进行验证和转义,使用内容安全策略(CSP),避免直接在页面中执行未经验证的用户输入。问题二:跨站请求伪造(CSRF)解决方案:使用CSRF令牌,验证请求来源,确保只有合法的用户可以提交请求。基于AI的学......