2017-05-26 34 views
-2

我有這樣的結構:矢量pthread_mutex_t的給我相同的地址的所有互斥

struct thread_items { 
    pthread_mutex_t mutex; 
    int i; 
    thread_items(pthread_mutex_t m, int i): mutex(m), i(i){} 
} 

我想創建這個結構數組並初始化所有互斥,而我在這。出於某種原因,當我打印互斥地址我得到的所有互斥的同一地址:

vector <thread_items*> thread_items_vec; 
for (int i = 0; i < 3; i++) 
{ 
    pthread_mutex_t mutex; 
    pthread_mutex_init(&mutex, NULL); 
    thread_items * items = new thread_items(mutex, i); 
    thread_items_vec.push_back(items); 
    cout << "Mutex " << i << " is " << &mutex << endl; 
} 

這導致與此打印:

Mutex 0 is 0x7fff9580b520 
Mutex 1 is 0x7fff9580b520 
Mutex 2 is 0x7fff9580b520 

我打印,這是因爲我的原因併發性有問題,我注意到我沒有鎖定正確的Mutex。

所以我的問題是我是否正確初始化互斥鎖,以便擁有3個不同的互斥鎖?我的印刷品是否真的在這裏出現問題? 從答案中,我打印始終相同的堆棧指針。這是否意味着我正在初始化我的Mutex的同一個地址?

+0

什麼是'thread_items_map'? –

+0

什麼是thread_items_map? –

+0

對不起,代碼非常複雜,我試着只帶上相關的部分。我將編輯我的問題 – Eyzuky

回答

2

要打印的堆棧變量mutex的地址,這被重新創建每次輪循環大概在同一地址

+0

因此,當我執行pthread_init_t(&mutex,NULL)時,這不是一個問題嗎?既然我給同一個地址? – Eyzuky

+3

更糟糕的是'互斥'每次在循環中被破壞。您將地址傳遞給不再存在的東西。 –

+0

你的回答和評論幫助我理解了一個我正在苦苦掙扎的bug。即使我的問題被投票了,這真的是值得的。謝謝你,先生。 – Eyzuky