#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]);
}
}
如果我在mutexes
函数中动态地为main
分配内存,那么在线程中使用mutexes[0]
是否安全?他们会引用相同的互斥锁,还是为每个线程创建一个副本?
我知道这是基础知识,但在阅读了一些教程后我感到困惑。
答案 0 :(得分:2)
堆内存在线程之间共享,在互斥锁的情况下是至关重要的。
如果要使用互斥锁同步两个线程,则必须在相同的互斥对象上调用pthread_mutex_lock
。
从概念上讲, mutex 是共享资源,而 lock 是特定于线程的:最多一个线程可以同时拥有锁并且锁不是在线程之间共享。另一方面的底层互斥锁是共享的:所有线程使用相同的互斥锁来确定获取锁是否安全。
请注意,在posix中,锁不是由实际对象表示,而是隐含在程序状态中。但我仍然认为这是思考这些事情的有用方法。