
多线程
文章平均质量分 96
outlier.cc
在校的三好学生,好饿好困好想睡
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线程(五)【环形队列CP | 线程池 | 线程完结】
信号量是一种计数器,用于控制对共享资源的访问,适用于多个线程并发访问时的资源分配。环形队列通过信号量管理生产者和消费者对数据的访问,保证了生产者在空间满时等待,消费者在无数据时等待。线程池使用懒汉单例模式创建,确保多线程任务的高效执行。STL容器默认不线程安全,智能指针中的shared_ptr通过CAS保证线程安全。自旋锁和悲观锁、乐观锁各有优缺点,适用于不同的场景。读者写者问题中,读者和写者的互斥关系通过读写锁实现,通常采用读者优先策略,防止写者饥饿。原创 2024-11-29 15:13:31 · 895 阅读 · 4 评论 -
线程(四)【死锁 | 条件变量 | CP模型】
死锁是线程因资源互相占用导致的永久等待状态,需满足互斥、请求与保持、不剥夺、循环等待四条件,破坏任一条件即可避免死锁。条件变量通过线程等待队列和通知机制,解决线程间竞争问题,实现同步。生产消费模型模拟生产者、消费者通过缓冲区交互,利用阻塞队列实现数据安全和高效传递,互斥保证资源原子性,同步调节生产与消费节奏,提高并发效率。条件变量需在加锁后使用,避免误唤醒时引发资源状态混乱。原创 2024-11-26 16:00:41 · 1021 阅读 · 1 评论 -
线程(三)【线程互斥(下)】
互斥锁用于解决多线程并发访问共享资源时的数据不一致问题,通过加锁保护临界区代码,保证线程对临界资源的访问是串行的。加锁用时间换取安全,但会降低并发性能,应尽量缩小临界区范围。线程切换期间持有锁不会释放,保证资源访问安全。互斥锁底层利用CPU指令集实现原子性操作,确保申请和释放锁的完整性。线程安全确保并发时结果一致,可重入函数在多执行流中结果一致且无副作用,可重入函数一定线程安全,但线程安全函数未必可重入。锁机制可实现线程安全但可能破坏重入性,多线程编程需平衡性能与安全。原创 2024-11-23 20:05:27 · 1040 阅读 · 5 评论 -
线程(三)【线程互斥(上)】
当多个线程同时访问共享资源时,可能会出现数据不一致的问题。例如,在多线程抢票的场景中,多个线程可能同时读取和修改共享变量 tickets,导致数据覆盖和错误的计数。这是因为线程切换时,每个线程会将数据加载到自己的寄存器中进行处理,而其他线程在切换后可能对同一数据进行修改,从而引发竞态条件。解决这个问题通常需要使用互斥锁(mutex)来确保每次只有一个线程能访问共享资源,避免并发修改导致的数据不一致。原创 2024-11-19 16:50:38 · 811 阅读 · 2 评论 -
线程(二)【线程控制】
线程是进程的执行分支,共享进程资源,没有独立的PID,只能通过LWP进行调度。线程创建通过`pthread_create`,传入线程执行函数及其参数,主线程可以通过`pthread_join`等待子线程结束,获取其返回值。线程终止有多种方式,包括正常结束、`pthread_exit`或`pthread_cancel`。Linux中没有明确的线程概念,操作系统通过`clone`创建轻量级进程,线程库通过维护线程的属性来管理线程。线程ID、栈空间等由线程库维护,而操作系统通过调度LWP来调度线程。原创 2024-11-15 15:34:12 · 1325 阅读 · 4 评论 -
线程(一)【理论篇】
线程是进程内部的执行分支,具有更细的执行粒度。与进程不同,线程共享进程的地址空间和资源。进程在创建时分配独立的资源,如 task_struct 和页表,而线程则只创建执行流,共享进程的资源。Linux 系统中,线程通过共享进程的 task_struct 结构来实现,线程并没有独立的调度控制块。这样,线程和进程的调度机制统一,线程比进程消耗更少的资源。原创 2024-11-11 14:59:23 · 802 阅读 · 0 评论 -
可重入函数 && volatile && SIGCHLD
在多线程或信号处理中,若一个函数在执行过程中被中断并在中断处理程序中再次调用,该函数称为不可重入函数。volatile 关键字可防止编译器优化变量,保证变量在内存中的可见性,避免多线程或信号处理中变量值不同步的问题。在进程管理中,父进程通过接收子进程发送的 SIGCHLD 信号来回收子进程,但若父进程未显式捕捉该信号,默认动作是忽略,可能导致僵尸进程。通过设置信号处理程序,父进程可及时回收子进程,防止内存泄漏。原创 2024-11-07 18:12:41 · 1020 阅读 · 5 评论