2015-05-27 92 views
0

有關使用pthreads多線程化的基本問題..
N個線程在不同/相似/相同時間都寫入同一文件..如何使其「安全」?即確保沒有2個線程試圖同時寫入。從多個線程寫入相同的文件。同步?鎖定? [pthreads] [PHP]

class WebRequest extends Thread { 
     public $cik; 

     public function __construct($cik){ 
      $this->cik = $cik; 
     } 

     public function run() { 
      for_cik($this->cik); 
      echo 'Running Thread : ' . $this->getCurrentThreadId() ."\n"; 
      sleep(rand(1,3)) ; 
     } 

     function for_cik($cik) { 
      //doing work 

      // lock() ; ? 
      Log_NIK::getInstance()->write_line($log) ; //write this 'safely' 
      //unlock() ; ? 
     } 
    } 

我搜索,但發現只有特定語言提醒

Edit(對於其他語言C#/ JAVA等):

的write_line功能是:

function write_line($line){ 

     file_put_contents($this->logFileName,$line."\n",FILE_APPEND) ; 
    } 
+1

爲什麼downvotes? –

+0

可能因爲你沒有顯示你的所有代碼。代碼的用途是:Log_NIK :: getInstance() - > write_line()。所以我們可以看到你的文件的寫法..你不能只是轉儲一堆代碼,並期望我們弄清楚。花點時間儘可能清楚地寫出一個很好的問題,儘可能詳細地描述我們需要的內容,以便我們看到發生了什麼。 –

回答

-1

在開始搜索特定文件的存在。如果不存在 - 創建它,然後放棄它。如果另一個線程正在嘗試寫入,它將無法這樣做。

$fp = fopen(dirname(__FILE__) . DIRECTORY_SEPARATOR . "somefile.txt", "w+"); 

if (flock($fp, LOCK_EX | LOCK_NB)) { 
    // do your stuff here 

    flock($fp, LOCK_UN); // release the lock 
    unlink (dirname(__FILE__) . DIRECTORY_SEPARATOR . "somefile.txt"); 
} 

fclose($fp); 
2

您不顯示您的所有代碼。如果您在某處使用file_put_contents(),則會傳遞LOCK_EX標誌。

file_put_contents('file.txt', 'content', LOCK_EX | FILE_APPEND); 
+0

就是這樣嗎?它需要的只是LOCK_EX標誌? –

+0

它鎖定了文件,所以沒有其他人可以訪問它,直到它完成。其他線程將等待解鎖。 –