线程和fork
多线程环境下,调用fork
函数创建子进程时,子进程完全继承了父进程的整个内存地址空间。
父进程中的互斥锁、多个线程在子进程中是如何处理的呢?
由于父子进程之间采用了写时复制技术,在子进程未改变互斥锁之前,父子进程对锁的状态是相同的,此时如何处理同步状态?
专注于工业物联网行业数据采集,嵌入式Linux系统裁剪,5G智慧网关软件开发等
多线程环境下,调用fork
函数创建子进程时,子进程完全继承了父进程的整个内存地址空间。
父进程中的互斥锁、多个线程在子进程中是如何处理的呢?
由于父子进程之间采用了写时复制技术,在子进程未改变互斥锁之前,父子进程对锁的状态是相同的,此时如何处理同步状态?
线程特定数据(thread-specific data),也称为线程私有数据(thread-private data),是线程单独的数据副本,存储在线程的私有存储空间,不与进程中其他线程共享。
线程键(pthread_key_t
),每个线程用其与自身特定数据地址进行关联。
析构函数用于线程退出时调用。通常使用malloc
为线程特定数据分配内存,析构函数通常用于释放已分配的内存。
屏障(barrier)是用户协调多个线程并行工作的同步机制。
屏障允许每个线程等待,直到所有的合作线程都到达某一点,然后从该点继续执行。
pthread_join
是一种特殊的屏障,允许一个线程等待,直到另一个线程退出。
互斥量防止多个线程同时访问同一共享变量。
条件变量允许一个线程就某个条件(共享变量)的变化状态通知其他线程,并让其他线程等待(阻塞于)该通知。
条件变量与互斥量一起使用,允许线程以无竞争的方式等待特定的条件发生。
读写锁也称为共享互斥锁,具有3种状态:读模式下的加锁状态、写模式下的加锁状态、不加锁状态。
一次仅有一个线程可以占有写模式下的读写锁,但是多个线程可以同时占有读模式下的读写锁。
读写锁非常适合于对数据结构读的次数远大于写的情况。
与互斥量相比,读写锁(reader-writer lock)运行更高的并行性。