08 2023 档案
摘要:[toc] #信号量 比条件变量更加简单  如图,当前老王的信号量为2,老赵的信号量为4,老赵开进去一辆车,那么空闲
阅读全文
摘要:[toc] #补充文档 > https://www.cnblogs.com/god-of-death/p/11452308.html #条件变量 锁的不足:只能给一个线程放行,剩下的还需要阻塞 条件变量:可以让多个线程访问临界区,但会出现混乱问题,仍需要和互斥锁搭配使用 #为什么 使用场景复杂,适用
阅读全文
摘要:[toc] #读写锁 一把锁,并不是读锁和写锁 称之为读写锁,因为他既可以锁定读操作,也可以锁定写操作 `pthread_rwlock_t rwlock;` 锁中记录了 * 锁的状态 打开关闭 * 锁定的操作 锁读 锁写 * 哪个线程持有钥匙 使用方式和互斥锁相同: 1. 找共享资源 2. 确定临界
阅读全文
摘要:[toc] #加锁后忘记解锁 ``` // 场景1 void func() { for(int i=0; i<6; ++i) { // 当前线程A加锁成功, 当前循环完毕没有解锁, 在下一轮循环的时候自己被阻塞了 // 其余的线程也被阻塞 pthread_mutex_lock(&mutex); ..
阅读全文
摘要:[toc] #线程函数 每一个线程都有一个唯一的ID,ID类型为pthread_t,这个ID是一个无符号长整型 unsigned long,如果想要得到当前线程的ID可以调用 `pthread_t pthread_self(void);` 线程创建: ``` #include int pthread
阅读全文
摘要:[toc] #linux和windows的差别 linux没有线程,windows系统有线程,但是两者对外部的表现是相同的 #差别 1. 线程有自己独立的地址空间,多个线程共用同一个地址空间 * 线程更加节省系统资源,开销更少,效率更高 * 每个线程有属于自己栈区和寄存器 * 多个线程共享:代码区
阅读全文
摘要:[toc] #stdcall cdecl 1. __cdecl和__stdcall都是参数从右到左入栈。 2. __cdecl是调用者负责清除栈中的参数,如A函数中调用B函数,参数由A函数负责清除;__stdcall是被调用者负责清除栈中的参数,如A函数中调用B函数,参数由B函数负责清除。 #艾斯比
阅读全文