【问题标题】:Vector of pthread_mutex_t gives me the same address for all mutexpthread_mutex_t 的向量为我提供了所有互斥锁的相同地址
【发布时间】:2017-05-26 14:12:24
【问题描述】:

我有这个结构:

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

我之所以打印这个是因为我的并发性有问题,而且我注意到我没有锁定正确的互斥锁。

所以我的问题是我是否正确初始化互斥锁以获得 3 个不同的互斥锁?我的打印在这里真的有问题吗? 从答案中,我正在打印始终相同的堆栈指针。这是否意味着我正在为同一个地址初始化我的 Mutex?

【问题讨论】:

标签: c++ mutex


【解决方案1】:

您正在打印堆栈变量 mutex 的地址,这会在每次循环时重新创建,大概在同一地址

【讨论】:

  • 那么当我执行 pthread_init_t(&mutex, NULL) 时这不是问题吗?既然我给了同样的地址?
  • 更糟糕的是mutex 每次循环都会被销毁。您正在将地址传递给不再存在的东西。
  • 您的回答和评论帮助我了解了一个困扰我太久的错误。即使我的问题被否决了,这确实是值得的。谢谢先生。
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多