突然想到VB6的多任务互斥问题
一个程序假如有两个窗口,这两个窗口都会访问foo函数,而foo函数会修改一组数据的内容。
当窗口1通过Timer触发或热键触发的方式调用foo函数,同时窗口2通过Click等事件触发(或像窗口1一样触发)调用foo.那么foo函数内部是否需要加锁做互斥?对于VB6似乎没提供什么加解锁的机制。
我是这样想的,这个问题主要是窗口1和窗口2都有不同的消息处理循环,他们处于不同的线程,理论上这两个窗口即使都通过Click等事件调用foo函数,foo函数也是需要加锁的,也就是凡是两个窗口都会访问的(有副作用的)函数都需要做互斥。但是实际上大家很少这么做,原因是鼠标只有一个,用户同一时间只可能操作一个窗口。但是如果绕过鼠标机制,比如一个窗口通过Timer来触发调用另一个窗口也会调用的函数则会有多任务访问的问题。
对于这种比较常见的场景,VB6却没有提供互斥机制来保证一组操作的原子性,我觉得VB6的设计本身是存在缺陷的。
[解决办法]
“我是这样想的,这个问题主要是窗口1和窗口2都有不同的消息处理循环,他们处于不同的线程”
你确认它们在不同的线程吗?如果是VB6的话很抱歉是单线程机制的。
[解决办法]
一个窗体上的两个timer会产生互相阻塞.
两个窗体上的两个timer也一样会产生阻塞.