为什么锁定在这种情况下不起作用?

时间:2015-09-11 16:46:58

标签: c# multithreading locking

/**
 * Return the user's home directory.
 */
function drush_server_home() {
  // Cannot use $_SERVER superglobal since that's empty during UnitUnishTestCase
  // getenv('HOME') isn't set on Windows and generates a Notice.
  $home = getenv('HOME');
  if (!empty($home)) {
    // home should never end with a trailing slash.
    $home = rtrim($home, '/');
  }
  elseif (!empty($_SERVER['HOMEDRIVE']) && !empty($_SERVER['HOMEPATH'])) {
    // home on windows
    $home = $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH'];
    // If HOMEPATH is a root directory the path can end with a slash. Make sure
    // that doesn't happen.
    $home = rtrim($home, '\\/');
  }
  return empty($home) ? NULL : $home;
}

正如您所看到的,BodySource在另一个线程中得到更新,并且还更新了BodyRefiner。 Body Refiner包含一个从主循环调用的GetBodies()方法。 CopyBodies()和GetBodies()中的调试日志不会记录相同的结果。当在两种方法中使用lock语句时,怎么会发生这样的事情呢?

2 个答案:

答案 0 :(得分:0)

CopyBodies()会在记录之前更改copiedBodies成员,因此如果在CopyBodies()之前调用GetBodies(),您将获得不同的日志,因为GetBodies()将记录旧成员,而CopyBodies()将记录新成员。

答案 1 :(得分:0)

我刚刚制作了一个body数组的深层副本,所以每当我编辑它时,我的copiedBodies数组也会改变。由于我没有锁定我的UpdateBodies()方法,我遇到了这些同步错误。