互斥锁为只读变量

时间:2013-05-03 12:20:28

标签: c pthreads mutex

语言是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

我需要一个互斥量来执行此操作吗?

2 个答案:

答案 0 :(得分:1)

问题是,* ptr是否受互斥锁保护。 作为代码,互斥锁与内存操作无关。另一个线程只是锁定互斥锁然后执行写操作。如果另一个线程想要写入内存,就像这个线程一样,它仍然可以工作。 请执行内存操作功能,通过互斥检查,然后互斥是合理的。否则,只需删除它,不要使用。

答案 1 :(得分:0)

使用互斥锁不会造成伤害。如果一旦启动线程,ptr及其指向的数据都不会改变(即只有main在启动任何线程之前设置ptr和数据,并且没有线程写入<{1}}或指向内存区域),您可以避免使用互斥锁。

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

你应该阅读一篇好文章Pthread tutorial

您可以考虑将read-write lockspthread_rwlock_rdlock和朋友一起使用(它们通常比互斥量更贵)。