语言是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
我需要一个互斥量来执行此操作吗?
答案 0 :(得分:1)
问题是,* ptr是否受互斥锁保护。 作为代码,互斥锁与内存操作无关。另一个线程只是锁定互斥锁然后执行写操作。如果另一个线程想要写入内存,就像这个线程一样,它仍然可以工作。 请执行内存操作功能,通过互斥检查,然后互斥是合理的。否则,只需删除它,不要使用。
答案 1 :(得分:0)
使用互斥锁不会造成伤害。如果一旦启动线程,ptr
及其指向的数据都不会改变(即只有main
在启动任何线程之前设置ptr
和数据,并且没有线程写入<{1}}或指向内存区域),您可以避免使用互斥锁。
如果其中一个线程正在写入指针(或指向数据)而其他线程正在读取它,那么您确实需要一个互斥锁来序列化访问(即使它可能恰好在没有任何互斥锁的硬件上工作)
你应该阅读一篇好文章Pthread tutorial。
您可以考虑将read-write locks与pthread_rwlock_rdlock和朋友一起使用(它们通常比互斥量更贵)。