作者maoyang (macmao)
看板MacDev
标题[心得] Thread-Safe的经验谈
时间Tue Aug 26 13:03:07 2008
刚才在看Object-C 2.0的新功能 @property 宣告, 其中谈到了thread-safe , 如果您有写过Multi-Thread的程式, 甚至写过device driver, 相信对於thread-safe应该不陌生, 而且当你的Object中的member variables同时会被两个以上的thread所存取, 这时候thread-safe的观念就很重要, 因为你的accessor会有funtion re-entry的问题, 当write function还没结束, 另一个thread又呼叫了Object的write function , 你永远无法确保记忆体中的资料完整性, 所以在Driver 的DDK 都会有文件特别说明如何用Lock来确保memory access的时候,
只有当一个thread完成write後, 另一个Thread才能继续write, 我发现这个观念不仅在multi-thread中受用, 在Google App Engine中的Big Table也受用, 在Google的简报, 让我印象最深刻的一句话--Writing data to big table is expensive , 因为每一次write data, google app engine就会将这份资料duplicate到不同的Cloud server , 这时候问题来了, 当不同的使用者, 同时从不同的Client, 同时要update一笔位在Big Table中的同一笔资料, 这个状况跟写driver或是multi-thread同时去写Object中的member variables一样.
不过thread-safe除了资料的同时存取, 在GUI framework似乎还有另一层意义-->代表强制分时多工的thread, 我在几年前开发过一个Peer to Peer 的Cocoa 程式, 当时遇到一个棘手的问题, 当使用者在操作GUI的时候(例如用滑鼠右键一直按Scroll Bar), 我这只Cocoa程式的背景负责传送资料的thread竟然会受Cocoa GUI元件影响而stop住, 我当时找了许多资料, 结果有国外的cocoa developer 社群就很多developer说这是因为Cocoa GUI framework 不支援thread-safe, 必须使用pthread来解决. 似乎NSThread不是强制分时多工的thread, 而是合作式的thread,
所以当一个thread里面暂住所有运算或是执行耗时的动作, 其他thread就无法动了, 但是我测了Safari并没有这个问题. 我後来不是用pthread, 改用另一个cocoa developer的trick将这个问题解决掉.
我已经4年没碰Cocoa 最近又开始复习, 於是先将这个问题先写下做个整理, 也许新版的Cocoa已经解决这个问题, @property 将read/write accessor的thread-safe考虑进去, 对於写multi-thread真的会减少许多debug的时间.
MyBlog
http://scmteamwork.blogspot.com
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.206.209