0

语言是 C,我的应用程序有多个线程。我有一个 int 数组,它的值可以更改,并且我有互斥体来读取和写入它的值。但是由于数组的基地址(如 &arr[0])永远不会改变,我需要一个互斥锁来读取这个值(数组的基地址)吗?

在主线程上我有

int arr[10];

在我的其他线程上

int *ptr = &arr[0]; // this line
pthread_mutex_lock(&mutex);
*ptr = 2;
pthread_mutex_unlock(&mutex);
ptr++;  // and this line

我需要一个互斥锁来做到这一点吗?

4

2 回答 2

1

问题是,*ptr 是否受互斥体保护。作为代码,互斥锁与内存操作无关。另一个线程只是锁定互斥锁然后进行写入。如果另一个线程想写内存,和这个线程一样,它仍然可以工作。请为内存操作做一个函数,带有互斥量检查,那么互斥量是合理的。否则,只删除这个,没有用。

于 2013-05-03T12:30:40.523 回答
0

使用互斥锁不会造成伤害。如果ptr线程启动后它所指向的和数据都没有改变(即在启动任何线程之前只在里面main设置ptr和数据,并且没有线程写入ptr或指向的内存区域),你可以避免使用互斥锁.

如果其中一个线程正在写入指针(或指向指向的数据),而其他线程正在读取它,您确实需要一个互斥锁来序列化访问(即使它可能碰巧在没有任何互斥锁的情况下在您的硬件上工作)。

您应该阅读一个好的Pthread 教程

您可以考虑将读写锁pthread_rwlock_rdlock和朋友一起使用(它们通常比互斥锁更昂贵)。

于 2013-05-03T12:23:56.000 回答