使用锁定/条件变量如何让C程序的结构不允许超过n个线程同时执行函数f的主体?假设你有60个创建线程,并且只允许10个函数一次输入。你可以用一个普通的想法写成伪代码吗?C程序不允许超过n个线程同时执行函数f
回答
您需要一个互斥锁,一个条件变量和一个整数。
- 获取互斥量。
- 虽然整数是10,但在条件变量上阻塞。
- 递增整数。
- 释放互斥锁。
- 调用该函数。
- 获取互斥量。
- 递减整数。
- 广播条件变量。
- 释放互斥锁。
当信号量存在时,这听起来像是一种非常迂回的做事方式。 –
@TimČas我会认为这是一个滥用信号量。信号量适合于一个任务产生某种东西而另一个任务消耗它。用它们作为屏障是丑陋的。请参阅[本文](http://www.barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore)了解更多信息。 –
信号量用于控制对有限数量资源的访问(例如,最多10个正在运行的功能)。这是什么。 –
旗号,作为@zwol建议,是非常适合这项工作:
- 你与它的初始值是线程数,以允许功能在任何给定的时间创建信号灯。
- 函数的第一件事是在信号量上执行
sem_wait()
。 - 您确保在每个可能的代码路径上,该函数在返回之前仅执行一次
sem_post()
。
@DavideVisentin,在这种情况下究竟是一个“锁”?不是互斥锁 - 至少,它不应该是一个互斥锁。我将这个问题解释为询问如何使用同步对象,其中“锁”和条件变量被命名为示例。 –
- 1. 一个函数,只允许N个并发线程
- 2. 执行程序服务 - 线程超时
- 3. 不是允许执行存储过程
- 4. c#同时执行2个线程
- 5. 执行线程超时
- 6. 只允许两个线程在一个函数上运行
- 7. 同时处理超过64个线程
- 8. Web服务:只允许一个线程在同一时间执行
- 9. 允许使用execvp执行程序
- 10. []不允许过载C++数组函数
- 11. JAVA通过n执行线程堆栈
- 12. C++线程的执行时间和执行线程在另一个线程
- 13. 执行程序线程繁忙时,Netty IdleStateHandler超时
- 14. 使用N个线程执行后查找执行时间
- 15. 跨线程不允许
- 16. 同时执行2个不同的函数,是线程我的答案?
- 17. pthreads:允许线程数
- 18. boost ::线程函数执行
- 19. 暂停/执行多线程程序中的一个线程(C#)
- 20. Javascript onfocus事件处理程序将只允许我执行一个函数
- 21. 执行多个线程同时
- 22. 为什么GIL不允许执行线程代码?
- 23. C++线程不执行
- 24. 线程执行时序
- 25. fnd一个__global__函数允许的最大块数/线程数
- 26. 允许执行多个语句,同时通过SQLAlchemy的
- 27. 应用程序事件日志超过最大允许计数
- 28. 允许只有一个线程通过/不使线程等待不必要
- 29. 如何让C++ 11线程运行多个不同的函数?
- 30. 为什么同步方法允许多个线程同时运行?
您在寻找[semaphores](http://linux.die.net/man/3/sem_wait)。 – zwol