假设我在内存中有一个数据结构S. S很复杂,比如树或图。我有两个线程穿过S,他们可能会同时尝试读取同一个地址。我的问题是:此时是否存在任何类型的隐式锁定,这样线程之间会产生争用?如果它有价值,我在常规SMP机器上使用C,pthreads。
答案 0 :(得分:3)
没有。不需要使用只读操作进行锁定。
如果你明确地实现它,只会有锁定。当有可能在同一时间修改(写入)结构时,通常会这样做。
答案 1 :(得分:0)
如果没有修改,则读取始终是线程安全的。
答案 2 :(得分:0)
首先,在C中没有进行隐式锁定.C非常像是“绳索”语言,因为你总是可以自由地挂起。
此外,请注意,在您从不写作时,无锁定阅读是安全的。如果你改变了这些值,那么阅读可能会得到错误的值。
最后,当您不确定时,有两个很酷的工具可以帮助您决定是否需要锁定DRD和helgrind(valgrind工具)。这两种都是可以检测各种与线程相关的错误的线程工具。只要知道他们会在敏感方面犯错。