问候!
我在POSIX多线程应用程序linux中运行了一个c ap,
在线程1中,我以这种方式设置了全局变量:
Pthread_mutex_lock(&Mutex1);
for(idx=0;idx<1000;idx++)
{
Data1[idx].doubleval = idx * 100.0 * anothervar ;
}//for
Pthread_mutex_unlock(&Mutex1);
在thread2中,我以这种方式获取全局变量:
Pthread_mutex_lock(&Mutex1);
for(idx=0;idx<1000;idx++)
{
doublexxx = Data1[idx].doubleval ;
DoSomething(doublexxx) ;
}//for
Pthread_mutex_unlock(&Mutex1);
现在,假设我不想在我的ap中使用Mutex,如果在线程2读取Data1 [33] .doubleval时thread1设置了Data1 [33] .doubleval,那么Data1 [33] .doubleval会是一个非常奇怪的值吗?我的意思是,例如,double var有4个字节,而thread1在此监视下将Data1 [33] .doubleval设置为前2个字节,而不是后2个字节
线程2试图读取Data1 [33] .doubleval ....这可能吗?
如果可能的话,如何保护双变量而不出现此类问题?
Mutex非常好用,我只是想知道是否还有另一种保护double var的方法
哪个线程1正在其中写入,至少线程2尝试从同一变量读取
将等待4字节double var完成!!!
最佳答案
是否可以读取“部分写入”的值取决于许多因素(例如目标系统和对齐方式),并且绝对不可移植。例如,假设此代码在16位CPU上运行,并在软件中模拟了浮点支持。
即使使用了互斥锁,第二个线程的行为仍将是不确定的,因为它不知道在第一个线程写入数据之前或在第一个线程写入数据之后是否已读取数据。
我怀疑您的设计存在更高层次的问题-也许您应该使用条件变量来使第二个线程等待,直到第一个线程写入为止。
我还怀疑您要删除互斥锁的原因是为了提高可伸缩性/性能。例如,一个线程使用一个数组的一部分,而另一个线程修改同一数组的完全不同的部分。如果这是您提出问题的原因,那么解决方案取决于您的情况-它可能就像使用多个锁(数组的每个区域一个互斥锁,每个条目最多一个互斥锁)一样简单,但是可能意味着实现“读取器” / writer”锁定(因此,只要没有其他线程在写,就允许多个线程同时从数组中读取)。