2010-10-11 69 views
1

我有一個生產者/消費者併發問題,我正在處理。問題是我試圖創建第一個線程後立即引發了段錯誤。pthread創建後立即發生Segfault

相關代碼:

客戶是一個結構聲明:

struct pr2_customer 
{ 
    pthread_t customer_id; 
}; 
typedef struct pr2_customer customer; 

客戶是一個C++載體,聲明如下:

vector<customer> customers; 

創建線程:

for(int i = 0; i < ncustomers; i++) 
{ 
    cout<<"creating a customer\n"; 
    pthread_create(&customers[i].customer_id, &attr, customerAction, (void*)i); 
} 

輸出:

創建客戶
段錯誤

customerAction有一個COUT語句,它永遠也不會被執行的第一線,帶領我相信線程永遠不會創建。

任何幫助,非常感謝。

+0

你可以發佈customerAction()的至少一部分嗎?你正在將一個整數轉換爲看起來不穩定的'void *'。 – mkb 2010-10-11 19:16:07

回答

1

在我看來,你沒有在customers保留任何空間。我認爲這是你需要的:

vector<customer> customers(ncustomers); 
+0

謝謝。調整矢量大小使其(種)起作用。現在我只需要弄清楚它爲什麼會陷入僵局。 – prelic 2010-10-11 19:26:52

+0

@prelic:由於您對矢量的使用不是爲了速度(但爲了方便)。使用at()方法(而不是運算符[])來獲取對象的引用。這會在返回參考之前檢查索引是否有效。 – 2010-10-11 19:51:33

0

你需要爲你的客戶分配一些空間。您只宣佈了一個客戶矢量,但該矢量是空的。

1

由於您使用的是STL向量,因此您應該使用便捷的vector :: iterator遍歷您的向量而不必關心其大小。

vector<customer>::iterator it; 

然後像這樣遍歷它。

for (it = customers.begin(); it != customers.end(); it++) 
0

很難看出你爲什麼要進行分割,因爲你似乎只給出了一個片段。你的矢量在哪裏生活,它實際上是否有任何成員? ncustomers從哪裏來?

我甚至不確定你爲什麼要將pthread_id包裝在一個結構中,或者你打算以後再增加這個類?