var tmp_leader = leader;
создаётся копия ссылки. Ошибка происходила из за того, что объект никак на самом деле не блокируется и сразу после проверки на null вторым потоком, первый тут же менял ссылку и к моменту .выполнения строчки Console.Write(leader.id)
; leader уже был равен null. Задачу можно было бы решить обернув тело цикла второго потока в locker.EnterReadLock()
locker.ExitReadLock()
, но в данном конкретном случае блокирование не необходимо и можно обойтись копированием ссылки. Этот вариант проще, чем тот, что Вам посоветовали на другом форуме, хотя решение тоже рабочее.this.i++
уже может дать неопределённое поведение. На такой случай есть Interlocked.Increment, делающую инкремент атомарно. При написании многопоточного кода следует избегать блокирования если оно не необходимо, так как любая синхронизация, а тем более ожидание освобождения объекта синхронизации это довольно дорого по времени. <?php header('Content-Type: text/html; charset=UTF-8'); ?>
<?php
function set_encrypted_cookie($name, $value) {
// зависит от вашей базы
// $enc_key_row = sql_request("select key,id from keytable order by date desc limit 1;");
$value = $enc_key_row['id'] . ':' . openssl_encrypt($value, "bf-cbc", $enc_key_row["key"]);
setcookie($name, $value);
}
function get_encrypted_cookie($name) {
$ret = false;
if(!empty($_COOKIE[$name]) {
$v = $_COOKIE[$name];
list($key_id, $value) = split($v, ':');
$key_id = (int)$key_id;
// зависит от вашей базы
// $enc_key_row = sql_request("select id,key,date from keytable where id=$key_id AND date > DATE_SUB(NOW(), INTERVAL 7 DAY);");
if($enc_key_row !== false)
$ret = openssl_decrypt($value, "bf-cbc", $enc_key_row["key"]);
}
return $ret;
}
?>
Программы, находящиеся в этих каталогах, требуют прав root, а у root эти каталоги включены в PATH. Так что все логично