【发布时间】:2015-04-22 19:04:17
【问题描述】:
如何以最少的修改定义一个线程安全的全局数组?
我希望通过使用互斥锁和同步块来完成对它的每次访问。
像“T”这样的东西将是某种类型(请注意,AFAIK 当前未定义“同步”关键字):
sync Array!(T) syncvar;
并且每次访问它都会与此类似:
Mutex __syncvar_mutex;
//some func scope....
synchronized(__syncvar_mutex) { /* edits 'syncvar' safely */ }
【问题讨论】:
-
保护阵列本身很容易。您只需创建一个包装结构,其中所有数组函数和运算符都重载,并且所有函数都同步。问题在于获取数组本身的元素。保护这些也变得更加复杂,因为一旦你从像
opIndex这样的函数中返回它们,它们就不再受到保护...... -
我认为这是
shared(T[])应该做的,但显然不是...... -
@AdamD.Ruppe All shared 真正做到的是使变量在线程之间共享,而不是线程本地。在某些情况下,如果您尝试使用 shared 做一些保证会出现问题的事情(在某些情况下与原子操作 IIRC 有关),编译器会抱怨,但它不会对互斥锁或同步做任何事情。随你(由你决定。同步类是处理共享对象的推荐方法,但它们没有完全实现(只是同步函数),并且任何逃脱该类的东西都将不再受到保护。
-
如果你能帮助我的人 - 请发布一个答案,不要让一些人......来获取你的赏金。因为最终(6 天后)它会自动送给不值得的人。
-
如果我有一个好的解决方案,我早就回答了……但我真的没有。我能想到的最好的就像乔纳森说的,尝试用同步方法做一个包装器。但我真的不知道。
标签: arrays multithreading synchronization d