关于mutex和任务分配器的问题

__GUNS_N_ROSES__ 2012-03-07 08:23:03
问题1:关于mutex的使用
要实现互斥是否多个有可能存在竞争问题的线程得共享使用同一把锁? 如果设计一个线程类,每个类中含有一个私有互斥锁,对竞争关系代码加锁的时候都用自己那把,还能达到互斥的目的吗?还是说,互斥锁是全局作用的(全局的话,作用范围是多少?整个操作系统?会话?进程?),和锁变量是否有多个没有关系?...绕来绕去不知道有没有说清楚问题 = =||。


问题2:关于任务分配器的设计
任务来自web,用户提交请求并由web server放入数据库,任务处理机包含一个服务器和多个客户端,由服务端保持和数据库通信并将任务信息收集起来分发给任务处理终端。
我是这样想的,分配器可以通过轮询数据库或者由web server进行通知两种方式保持实时性,但考虑到web server可能存在短时间存在大量任务请求的状况,一个任务建一次连接那请求队列大概很快就排不下了,或者定时(1s)发送一次,但这样web server压力就会变大,而且还要处理异常情况导致的数据混乱问题。所以打算由分配器进行定时轮询(sleep(1))数据库。
处理机终端不断向分配器发送GET_TASK请求,服务器维护一个任务队列,不为空的时候才发任务过去。由于是异步I/O,但我希望没有任务的时候可以阻塞和客户端通信的线程,所以打算用一个信号量来实现一个生产者——消费者模型。

我的问题是觉得充满mutex和semaphore的代码看着觉得十分诡异,显得复杂了,程序流越来越难搞清,我是在linux上写的,gdb的多线程调试也不太会。因为第一次写这种东西,基本上完全凭感觉来写了,希望高手们能提供意见,你们一般是怎么做的,闭门造车就没意思了。
...全文
168 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ohayou 2012-03-08
  • 打赏
  • 举报
回复
mutex可具名 不同进程使用同样名称创建的mutex在系统中是同一对象
羽飞 2012-03-07
  • 打赏
  • 举报
回复
我没做过这样的东西,但是有个建议,楼主是不是可以采用逐步改进的方法做这个东西,先做出来,简单一点,不要信号量啥的,等功能测试通过之后,再添加同步机制,再添加信号量,最后测试大并发量,优化性能
th_000 2012-03-07
  • 打赏
  • 举报
回复
mutex和信号量都是多进程的,临界区是多线程,而多cpu就要用到tsl指令在保护内存。
他们都是对存在竞争的资源进行保护,防止同时访问的
对同样的资源,用同样的锁
justkk 2012-03-07
  • 打赏
  • 举报
回复
1、必须共享同一个mutex。如果是多个进程之间互斥,这个mutex本身还必须放入共享内存,设置进程间共享属性
__GUNS_N_ROSES__ 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnwyllmm 的回复:]

我没做过这样的东西,但是有个建议,楼主是不是可以采用逐步改进的方法做这个东西,先做出来,简单一点,不要信号量啥的,等功能测试通过之后,再添加同步机制,再添加信号量,最后测试大并发量,优化性能
[/Quote]

主要的部分都已经做过功能测试了,差不多就剩下一个任务分配器了,这需要独立的一个线程去完成,和服务器线程并行的,但只有一个全局的DB对象,作查询的可能会互相覆盖查询结果,必须要加锁才能完成功能测试。

顺便请教关于加锁的位置问题,比如一个Log类,是不是直接加载Log的I/O函数上比较好?那么类似的,我也把锁加在数据库类的查询方法上? 之前都是外部加锁的,也就是调用数据库方法的地方。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧