
从零开始学嵌入式-6.并发程序设计
文章平均质量分 84
并发程序设计
Jing's secret
头发少,样子老,背个双肩包像沙雕
展开
-
6.15 信号灯(有名信号灯、无名信号灯、system V信号灯)
释放资源,如果没有线程阻塞在该sem上,表示没有线程等待该资源,这时该函数就对信号量的值进行增1操作,表示同类资源多增加了一个。如果至少有一个线程阻塞在该sem上,表示有线程等待资源,信号量为0,这时该函数保持信号量为0不变,并使某个阻塞在该sem上的线程从sem_wait函数中返回。获取资源,如果信号量为0,表示这时没有相应资源空闲,那么调用线程就将挂起,直到有空闲资源可以获取。//对某一个信号灯的操作,如果同时对多个操作,则需要定义这种结构体数组。信号灯也叫信号量,用于进程/线程同步或互斥的机制。原创 2023-06-16 10:10:52 · 401 阅读 · 0 评论 -
6.14 消息队列
MSG_EXCEPT:与msgtype配合使用返回队列中第一个类型不为msgtype的消息。IPC_NOWAIT:如果没有返回条件的消息调用立即返回,此时错误码为ENOMSG。IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回。1 消息结构必须有long类型的msg_type字段,表示消息的类型。0:当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列。msgtype>0:收到的第一条 msg_type类型的消息。msgtype=0:收到的第一条消息,任意类型。原创 2023-06-16 10:00:57 · 149 阅读 · 0 评论 -
6.13 信号机制(信号概念、发送、定时器、信号捕捉、SIGCHLD)
有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。判断一个信号是否在集合中。sa_sigaction: 另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。信号递达(Delivery ):实际信号执行的处理过程(3种状态:忽略,执行默认动作,捕获)信号的阻塞概念:信号的”阻塞“是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。原创 2023-06-16 09:48:31 · 742 阅读 · 0 评论 -
6.12 共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)
共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝 共享内存在内核空间创建,可被进程映射到用户空间访问,使用灵活 由于多个进程可同时访问共享内存,因此需要同步和互斥机制配合使用。IPC 对象包含: 共享内存、消息队列和信号灯集 每个IPC对象有唯一的ID 用Key关联 IPC对象创建后一直存在,直到被显式地删除 ipcs / ipcrm。映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问。每块共享内存大小有限制。共享内存删除的时间点。原创 2023-06-14 15:01:28 · 726 阅读 · 0 评论 -
6.11 有名管道和无名管道
无名管道(pipe)有名管道 (fifo)信号(signal)共享内存(mmap)套接字(socket)原创 2023-06-14 14:44:48 · 531 阅读 · 0 评论 -
6.10 线程池及gdb调试多线程
我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间,当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。1 任务队列,存储需要处理的任务,由工作线程来处理这些任务。解决:检查函数的参数,添加对应的参数。原创 2023-06-12 09:33:54 · 878 阅读 · 0 评论 -
6.9 条件变量的使用及注意事项
2 如果pthread_cond_signal或者pthread_cond_broadcast 早于 pthread_cond_wait ,则有可能会丢失信号。1 pthread_cond_wait(&cond, &mutex),在没有资源等待是是先unlock 休眠,等资源到了,再lock。所以pthread_cond_wait he pthread_mutex_lock 必须配对使用。原创 2023-06-09 10:03:11 · 806 阅读 · 0 评论 -
6.8 互斥锁/读写锁的概念及使用、死锁的避免
在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。原创 2023-06-08 15:16:05 · 743 阅读 · 0 评论 -
6.7 线程的取消和清理
2.pthread_cleanup_pop()被执行且参数为0,pthread_cleanup_push回调函数routine不会被执行.4.线程内的return 可以结束线程,也可以给pthread_join返回值,但不能触发pthread_cleanup_push里面的回调函数,所以我们结束线程尽量使用pthread_exit退出线程。3 pthread_cleanup_push 和pthread_cleanup_pop可以写多对,routine执行顺序正好相反。输入命令bt(打印调用栈)原创 2023-06-07 14:40:20 · 450 阅读 · 0 评论 -
6.6 线程的回收及内存演示
2. const pthread_attr_t *attr:指向线程属性的指针,用于设置新线程的属性,可以为NULL,表示使用默认属性。3. void *(*start_routine)(void *):指向线程函数的指针,新线程将从这个函数开始执行。1. pthread_t *thread:指向线程标识符的指针,用于存储新线程的标识符。4. void *arg:传递给线程函数的参数,可以为NULL,表示不传递参数。错误类型:参数不匹配,期望的是char * ,但参数retv是void *原创 2023-06-07 14:25:40 · 494 阅读 · 0 评论 -
6.5 线程编程(线程概念和创建)
意义:表示pthread_create参数3的定义和实际代码不符合,期望的是void * (*)(void *) ,实际的代码是int * (*)(char *)对于一个默认属性的线程 A 来说,线程占用的资源并不会因为执行结束而得到释放。arg 传递给routine的参数 ,参数是void * ,注意传递参数格式,arg 传递给routine的参数 ,参数是void * ,注意传递参数格式。解决方法:转换为指定的指针类型后再用*取值 比如:*(int *)arg。原创 2023-06-01 10:06:35 · 519 阅读 · 0 评论 -
6.4 GDP调试多进程程序
设置GDB调试子进程设置GDB调试父进程设置GDB跟踪调试单个进程或多个on:只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式off:父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定),另一个进程会被设置为暂停状态。显示GDB调试的进程inferiors 进程序号(1,2,3....)切换GDB调试的进程。原创 2023-05-31 14:41:58 · 713 阅读 · 0 评论 -
6.3 守护进程
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。进程组(Process Group): 进程集合,每个进程组有一个组长(Leader),其进程 ID 就是该进程组 ID。子进程变成孤儿进程,被init进程收养。原创 2023-05-31 09:32:50 · 621 阅读 · 0 评论 -
6.2 exec函数族
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。ork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码。调用了setsid函数的进程,既是新的会长,也是新的组长。原创 2023-05-30 14:38:58 · 577 阅读 · 0 评论 -
6.1 进程的创建和回收
除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。如原本 NI 值为 0,则只能调整为大于 0。pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。原创 2023-05-29 16:58:21 · 1211 阅读 · 0 评论