From 360ad45ed03c422df331d2d23a497ae8a3b9bfcb Mon Sep 17 00:00:00 2001 From: 1AoB <2453468739@qq.com> Date: Sun, 21 Apr 2024 16:45:21 +0800 Subject: [PATCH] c++ --- .../post/2024-04-19面试复盘/index.zh-cn.md | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/exampleSite/content/post/2024-04-19面试复盘/index.zh-cn.md b/exampleSite/content/post/2024-04-19面试复盘/index.zh-cn.md index 80d200d..5b3b2c4 100644 --- a/exampleSite/content/post/2024-04-19面试复盘/index.zh-cn.md +++ b/exampleSite/content/post/2024-04-19面试复盘/index.zh-cn.md @@ -301,12 +301,32 @@ auto_ptr是C++98中引入的第一个智能指针,但是由于他的不安全 2)主线程还会给任务队列中添加任务,子线程负责从任务队列中取任务 - +![1713687466179](图片/1713687466179.png) --- 有一个很傻的问题: +问任务队列加了互斥锁,其他线程想访问时会被阻塞,你还是如何唤醒他们的? + +> 答:这个其实不用唤醒,我们在使用互斥锁保护一段共享资源时, +> +> 访问前上锁,访问后解锁, +> +> 当我们某一个线程正在访问这个共享资源时上锁保护,其他的线程就会被排斥在外, +> +> 然后这些线程就会不断地尝试加锁, +> +> 当正在操作共享资源的这个线程解锁后,哪个线程先抢到,哪个线程就使用共享资源, +> +> 是不需要唤醒的. + +- 总结一下,如何唤醒阻塞? + +1)如果是互斥锁导致的阻塞,阻塞的时候就使用lock加锁,要唤醒的时候使用ulock解锁就行了. + +2)如果是条件变量导致的阻塞,那么当你要阻塞的时候就是wait函数,如果你要唤醒一个那就是notify_one,如果要唤醒全部那就是notify_all +