2014-12-13 40 views
0

我正在用C++編寫程序來在Linux上進行內部聊天。該代碼具有包含私有結構的類屬性,該結構在共享內存中實例化,因此在多個終端中運行的相同程序可以訪問相同的數據並使聊天工作。我的問題是,聊天必須同時讀寫,所以你必須創建一個線程閱讀和另一個閱讀,但我不知道熱使用它,當我遇到問題時,我進入線程,指針 到共享內存結構被重置,可以這麼說,指向地址0x0並給出了分段錯誤。使用C++類中的線程進行段錯誤

這不是我的程序,但不是放這麼多行代碼我在一個例子中總結了我做錯的部分,你能告訴我我做錯了什麼嗎?爲什麼我會陷入seg故障?

#include <thread> 
#include <iostream> 
#include <mutex> 
#include <condition_variable> 

class bar { 
private: 
    struct SharedMessage{ 
    int number=21; 
    }; 

    SharedMessage* sharedMessage_; 

public: 
    void foo(void) { 
    std::cout << "hello from member function: " << std::endl; 
    std::cout << sharedMessage_->number << std::endl; 
    } 
    void thread (void){ 
    sharedMessage_=new SharedMessage; 
    std::thread t(&bar::foo, bar()); 
    t.join(); 
    std::cout << sharedMessage_->number << std::endl; 
    } 
}; 

int main() 
{ 
    bar Object; 
    Object.thread(); 
} 
+3

你的意思是'這個'代替'bar()'嗎? – 2014-12-13 18:15:34

回答

1

的情況是:

std::thread t(&bar::foo, bar()); 

創建一個匿名bar對象,並將副本線程。其sharedMessage的指針未初始化,因此在嘗試訪問sharedMessage號碼時出現段錯誤。

如果你想使用它的初始化指針傳遞當前的對象,你可以這樣做:

std::thread t(&bar::foo, this); 

如果你想通過另外一個對象,你可以做得一樣好,但你必須initalize的sharedMessage ,例如通過給你的類一個默認的構造函數。

0

從讀取線程上的C++引用。看起來你需要將std :: ref(bar)傳遞給bar實例。

我覺得解決方案應該是以下幾點:

void thread (void){ 
    sharedMessage_=new SharedMessage; 
    bar instance; 
    std::thread t(&bar::foo, std::ref(instance)); 
    t.join(); 
    std::cout << sharedMessage_->number << std::endl; 
    } 
+0

好主意,以避免與ref的匿名對象!但是我擔心'instance'中的sharedMessage指針仍然是未初始化的,因此segfault仍然會發生。 – Christophe 2014-12-13 18:34:24