线程之间是不是共享指针? [复制]

Posted

技术标签:

【中文标题】线程之间是不是共享指针? [复制]【英文标题】:Are pointers shared between threads? [duplicate]线程之间是否共享指针? [复制] 【发布时间】:2013-11-28 16:32:55 【问题描述】:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

pthread_mutex_t *mutexes;

void *thread_work(void *id)

    long tid = (long)id;

    while(some_condition)
    
        pthread_mutex_lock(mutexes[0]);
    

如果我在main 函数中为mutexes 动态分配内存,那么在线程中使用mutexes[0] 是线程安全的吗?他们会引用相同的互斥锁还是为每个线程创建一个副本?

我知道这是基础知识,但是在阅读了一些教程后我感到困惑。

【问题讨论】:

线程将访问相同的互斥体。堆内存在线程之间共享。这个答案相当不错***.com/questions/1665419/… 它将被共享,但应该是线程安全的。 computing.llnl.gov/tutorials/pthreads/#PassingArguments @Phil_12d3 我认为这不能回答我的问题。我不想将互斥锁作为参数传递。我希望它们成为全局变量,并在线程中引用它们。互斥体的索引将根据某些条件进行选择。 这是否更有帮助。 ***.com/questions/7382636/… 这个问题的有趣之处在于:是否需要使用另一个互斥锁来保护对pthread_mutex_t * mutexes 的并发访问? 【参考方案1】:

堆内存在线程之间共享,这在互斥体的情况下至关重要。

如果您想使用互斥锁同步两个线程,它们必须在同一个互斥锁对象上调用pthread_mutex_lock

从概念上讲,mutex 是共享资源,而 lock 是线程特定的:最多一个线程可以同时拥有锁,而锁则没有线程之间共享。另一边的底层互斥锁是共享的:所有线程使用同一个互斥锁来判断获取锁是否安全。

请注意,在 posix 中,锁不是由实际对象表示的,而是隐含在程序状态中的。但我仍然觉得这是思考这些事情的有用方式。

【讨论】:

以上是关于线程之间是不是共享指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在两个线程之间共享 QAxObject?

图解shared_ptr共享智能指针原理分析

临界区是不是确保由一个线程修改的任何数据类型的共享变量对其他线程可见? [复制]

在线程之间共享引用的终身麻烦

使用无锁指针队列在线程之间移动数据是不是安全

当每个线程可以处理与其他线程中的数据无关的数据时,是不是可以在线程之间重用一个共享托管对象上下文?