2012-08-30 70 views
0

在給出用例的情況下,我的印象是WinRT對象的引用計數是線程安全的。但是我遇到了一個我不知道解決問題的錯誤。例如,下面的代碼崩潰相當快:C++/CX WinRT指針的引用計數的線程安全性

ref class C sealed { 
public: 
    C() { } 
    virtual ~C() {} 
}; 

[Windows::Foundation::Metadata::WebHostHidden] 
public ref class MainPage sealed { 
public: 
    MainPage() : _latest(nullptr) { 
     InitializeComponent(); 
     Windows::System::Threading::ThreadPool::RunAsync(
      ref new Windows::System::Threading::WorkItemHandler(
       this, 
       &MainPage::SetLatest)); 
     Windows::System::Threading::ThreadPool::RunAsync(
      ref new Windows::System::Threading::WorkItemHandler(
       this, 
       &MainPage::OnRendering)); 
    } 
    virtual ~MainPage(){} 
private: 
    C^ _latest; 
    void SetLatest(Windows::Foundation::IAsyncAction^ operation){ 
     while (true) { 
      _latest = ref new C(); 
     } 
    } 
    void OnRendering(Windows::Foundation::IAsyncAction^ operation) { 
     while (true) { 
      auto c = _latest; 
     } 
    } 
}; 

是WinRT的指針(即,像C^一個引用類型)應該被正確地引用計數時的讀/寫操作都在競相?有沒有我不知道的一個單獨的問題,導致這次崩潰?

回答

5

更改到ref class對象的引用計數是同步的,但更改爲T^對象不是。

您有兩個線程同時訪問_latest,其中一個線程正在修改_latest,因此您需要同步訪問_latest,例如,使用std::mutex

+0

那麼解釋它。你能鏈接到文檔說明這一點? –

+1

記錄哪個部分? 'ref class'是一個COM類的類型,因此必須遵循所有的COM線程規則。 'T ^'與其他需要外部同步的類型沒有區別。 –