2011-03-05 98 views
0

我有2個線程,他們都刪除內存在兩端nedded。我的問題是,也許可能發生線程在另一線程啓動之前開始並完成,因此它會刪除另一線程所包含的內存。我如何同步它們,以免發生這種情況。
作爲設計我的主題是這樣的:同步2 posix線程

void* thread1(void* arg) 
{ 
    lock(&mutex); 
    counter++; 
    unlock(&mutex); 

    // more code here 

    lock(&mutex); 
    counter--; 
    if(counter == 0) 
    { 
     delete a; 
     delete b; 
    } 
    unlock(&mutex); 
} 

另一個線程看起來是一樣的,但是這不是unoff停止線程1線程2開始之前完成。
謝謝。

回答

3

你不能只是做:

void *thread1(void* arg) 
{ 
    // your code 

    lock(&mutex); 
    counter++; 
    if (counter == 2) { 
     // whatever 
    } 
    unlock(&mutex); 
} 

假設計數器要麼線程開始前初始化爲0,當然。

+0

是的,這也是我的解決方案,我現在看到它的工作。謝謝 – Kobe 2011-03-05 14:23:51

+0

那麼如果第一個線程在第二個線程啓動之前開始並結束呢? – johnnycrash 2011-04-06 21:19:20

+0

然後'第二個線程啓動時'計數器== 1',直到它需要互斥體。當thread2獲取互斥鎖時,'counter ++'將其提升到2,並且thread2可以繼續進行清理。 – Mat 2011-04-06 21:23:58

2

這裏很好的使用了互斥體,順便說一下。

您可以添加另一個計數器,受同一互斥鎖保護,只對其執行增量操作。然後在退出代碼中,您可以檢查它以確認所有線程都已啓動。

即將其更改爲「if(counter == 0 & & started == 2)」。

既然你保護計數器&開始與互斥訪問,如果1 & 2都開始或者完成之前,首先要完成將看到啓動= 2,計數器= 1另將看到啓動= 2,計數器= 0並刪除資源。

如果一個線程在另一個線程開始運行之前運行完成,它會看到開始= 1和計數器= 0.然後另一個線程將看到開始= 2和計數器= 0並清理。

+0

感謝您的回覆,我只是測試,看看是否計數器== 2,少代碼:) – Kobe 2011-03-05 14:39:16

+0

您的代碼保證資源在線程啓動之前創建,是嗎?在這種情況下,做計數器= 2應該工作。 – 2011-03-05 14:56:46