多进程和多线程
现代操作系统通过多进程实现多任务宏观的并发执行
进程是资源分配的基本单元
线程是处理器调度的基本单位
进程和线程,不同操作系统的实现方式可能不同
进程通信
linux 进程通信方式:
管道:命名管道(mkfifo),父子进程间匿名管道 pipe,内核中利用文件实现
信号量:sem_init,sem_post 等,为了防止不同进程临界区资源产生问题,P 操作获取信号量,V 操作释放信号量
信号:sigaction,kill 等,Ctrl-C 产 SIGINT 信号,Ctrl-\产 SIGQUIT 信号,Ctrl-Z 产 SIGTSTP 信号
消息队列:msgget,存在与内核中,数据会从用户空间和内核空间相互复制,不适合数据量大操作频繁的场景
共享内存:shmget,地址空间映射,不需要复制数据,读写需要其他方式进行同步
套接字:socket,不同机器间的数据通信
线程同步
linux 内核没有提供线程,通过 pthread 库实现用户级多线程,c++11 后标准库开始支持多线程,实现原理是为每个创建的线程在当前进程空间生成运行栈
windows 系统提供系统线程,可通过 CreateThread,ExitThread 等系统函数操作,或 vc++运行库提供_beginthreadex 对 CreateThread 的包装函数
以下主要以 linux 下 c++学习和总结
| 功能 | pthread | std::thread(c++11) | thrd_t(c11) |
| :—– | :———- | :———- |
|线程创建 | pthread_create | thread 类 | thrd_create(C11) |
|互斥 mutex | pthread_mutex_init | mutex 类 | mtx_init |
|条件变量 | pthread_cond_init | condition_variable | cnd_init |
|读写锁 | pthread_rwlock_init | thread 类 | thrd_create(C11) |
|信号量 | sem_init | counting_semaphore(C++20) | sem_init |
|屏障 | pthread_barrier_init | barrier(C++20) | 无 |
进程通信的信号量和信号 ,线程同步也可以使用
互斥锁,只有加锁和不加锁两种状态,使用简单情况,相当于 0,1 状态的信号量
信号量,信号量的 count 代表多个可用的资源,比如多台打印机的情况
条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。