2013-05-03 83 views
0

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

在主线程我有

int arr[10]; 

在ohter线程我已经

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

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

+1

请显示更真实的代码。 – 2013-05-03 12:25:18

+1

'arr'是一个全局变量吗? – 2013-05-03 12:30:12

回答

0

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

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

您应该阅读好Pthread tutorial

你可能会考虑使用read-write lockspthread_rwlock_rdlock和朋友(他们通常比互斥更昂贵)。

1

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