2017-05-26 52 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