2013-11-15 94 views
1
#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]线程安全吗?他们是要引用相同的互斥锁还是为每个线程创建副本?线程之间共享指针吗?

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

+1

线程将访问相同的互斥锁。堆内存在线程之间共享。这个答案是相当不错的http://stackoverflow.com/questions/1665419/do-threads-have-a-distinct-heap/1665432#1665432 – Baldrick

+0

它将被共享,但应该是线程安全的。 https://computing.llnl.gov/tutorials/pthreads/#PassingArguments –

+0

@ Phil_12d3这不能回答我的问题,我想。我不想传递互斥参数。我希望它们是全局变量,只需在线程中引用它们即可。互斥体的索引将根据某些条件进行选择。 – pmichna

回答

2

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

如果要使用互斥锁同步两个线程,他们必须调用pthread_mutex_lock的相同互斥对象。

从概念上讲,互斥是一个共享的资源,而是线程专用:最多只有一个线程可以在同一时间锁定和锁不是线程之间共享。另一方面的底层互斥体是共享的:所有线程使用相同的互斥体来确定是否安全获取锁。

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