LV6 并发程序设计
文章平均质量分 73
学习进程与线程的相关知识
字母哥先生
痛苦的本质来源于你对现状的不满,焦虑的本质来源于你成长速度太慢。
展开
-
【LV6 DAY15 消息队列】
消息队列是System V IPC对象的一种。3.控制(删除)消息队列 msgctl。2.打开/创建消息队列 msgget。3.向消息队列发送消息 msgsnd。1.打开/创建消息队列 msgget。2.从消息队列接收消息 msgrcv。成功时返回0,失败时返回-1。原创 2023-11-09 17:02:59 · 32 阅读 · 1 评论 -
【LV6 DAY14 信号中断和阻塞】
有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。信号递达(Delivery ):实际信号执行的处理过程(3种状态:忽略,执行默认动作,捕获)信号的阻塞概念:信号的”阻塞“是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。首先,若oset是非空指针,那么进程的当前信号屏蔽字通过oset返回。SIG_BLOCK : 把参数set中的信号添加到信号屏蔽字中。SIG_UNBLOCK: 从信号屏蔽字中删除参数set中的信号。原创 2023-11-09 15:17:56 · 34 阅读 · 1 评论 -
【LV6 DAY13 信号机制】
SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。sa_sigaction: 另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。2.使用signal/sigaction 函数,把自定义的handle和指定的信号相关联。sa_handler: 是一个函数指针,其含义与 signal 函数中的信号处理函数类似。SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。ITIMER_REAL:以逝去时间递减。原创 2023-11-09 11:21:18 · 41 阅读 · 1 评论 -
LV6 day12 共享内存和内存映射
flags:由以下几个常值指定:MAP_SHARED(共享的) MAP_PRIVATE(私有的), MAP_FIXED(表示必须使用 start 参数作为开始地址,如果失败不进行修正),其中,MAP_SHARED , MAP_PRIVATE必选其一,而 MAP_FIXED 则不推荐使用。id是子序号,它是一个8bit的整数。(4) 用于映射的文件大小必须>0,当映射文件大小为0时,指定非0大小创建映射区,访问映射地址会报总线错误,指定0大小创建映射区,报非法参数错误(Invalid argument)原创 2023-11-08 19:30:34 · 32 阅读 · 1 评论 -
LV6 day11 有名管道和无名管道
3.FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加的末尾。3.管道也可以看成一种特殊的文件,对于它的读写也可以使用普通的read()、write()等函数。2.该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了有名管道之后,两个进程就可以把它当作普通文件进行读写操作,使用非常方便。1.只能用于具有亲缘关系的进程之间的通信(父子进程或兄弟进程)无名管道是Linux中管道通信的一种原始方法,如图所示。有名管道是无名管道的一种改进,如图所示。原创 2023-11-08 18:50:54 · 30 阅读 · 1 评论 -
LV6 day10 线程池及GDB调试
我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间,当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。1 任务队列,存储需要处理的任务,由工作线程来处理这些任务。解决:检查函数的参数,添加对应的参数。原创 2023-11-01 20:58:50 · 34 阅读 · 0 评论 -
LV6 day9 条件变量的使用及注意事项
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-10-31 22:01:24 · 29 阅读 · 1 评论 -
LV6 day8 互斥锁/读写锁的概念及使用、死锁的避免
在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。原创 2023-10-31 10:45:49 · 34 阅读 · 1 评论 -
LV6 DAY6线程的回收与分离
注意:pthread_join 是阻塞函数,如果回收的线程没有结束,则一直等待。错误类型:参数不匹配,期望的是char * ,但参数retv是void *错误可能:1拼写错误,2对应的头文件没有包含。解决:在参数前面加强制类型转换(char。错误类型:未知的类型pthead_t。1 使用pthread_detach。2 创建线程时候设置为分离属性。原创 2023-10-29 19:58:52 · 27 阅读 · 1 评论 -
LV6 DAY5 线程的创建和参数传递
collect2: error: ld returned 1 exit status --------这个链接错误,意义:表示pthread_create参数3的定义和实际代码不符合,期望的是void * (*)(void。createP_t.c:(.text+0x4b):对‘pthread_create’未定义的引用。arg 传递给routine的参数 ,参数是void * ,注意传递参数格式,注意事项:1. 主进程的退出,它创建的线程也会退出。1.通过地址传递参数,注意类型的转换。原创 2023-10-28 14:03:07 · 41 阅读 · 1 评论 -
LV6 DAY7线程的取消和清理
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-10-29 20:01:48 · 38 阅读 · 1 评论 -
LV6 并发程序设计 DAY1 笔记
进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的。转载 2023-10-25 15:52:46 · 25 阅读 · 0 评论