Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在不使用互斥锁的情况下保护双变量_C_Multithreading_Gcc_Mutex - Fatal编程技术网

C 在不使用互斥锁的情况下保护双变量

C 在不使用互斥锁的情况下保护双变量,c,multithreading,gcc,mutex,C,Multithreading,Gcc,Mutex,问候 我有一个在linux上运行的CAP,它是一个POSIX多线程应用程序, 在线程1中,我通过以下方式设置全局变量: Pthread_mutex_lock(&Mutex1); for(idx=0;idx<1000;idx++) { Data1[idx].doubleval = idx * 100.0 * anothervar ; }//for Pthread_mutex_unlock(&Mutex1); Pthread\u mutex\u lock(

问候

我有一个在linux上运行的CAP,它是一个POSIX多线程应用程序, 在线程1中,我通过以下方式设置全局变量:

Pthread_mutex_lock(&Mutex1); 
for(idx=0;idx<1000;idx++)
{
      Data1[idx].doubleval = idx * 100.0 * anothervar  ;
}//for 
Pthread_mutex_unlock(&Mutex1); 
Pthread\u mutex\u lock(&Mutex1);

对于(idx=0;idx需要担心的问题不是在写入过程中读取的值;我不知道有哪个系统可以这样做。问题是第二个线程的行为将是未定义的,因为您不知道它是在第一个线程写入给定内存段之前还是之后读取。如果没有互斥锁,或者功能等效的东西,无法获得定义良好的行为。

是否可以读取“部分写入”值取决于大量因素(例如目标系统和校准)举个例子,想象一下这段代码在16位CPU上运行,并在软件中模拟浮点支持

即使使用互斥锁,第二个线程的行为仍然是未定义的,因为它不知道在第一个线程写入数据之前还是在第一个线程写入数据之后读取了数据

我怀疑您的设计中存在更高级别的问题——也许您应该使用一个条件变量使第二个线程等待第一个线程完成编写


我还怀疑,您要求删除互斥锁的原因是为了提高可伸缩性/性能。例如,一个线程使用阵列的一部分,而另一个线程修改同一阵列的完全不同部分。如果这是您问题背后的原因,那么解决方案取决于您的场景-它可以ld与使用多个锁一样简单(每个数组区域一个互斥锁,每个条目最多一个互斥锁),但可能意味着实现一个“读/写”锁(这样,只要没有其他线程在写,就允许多个线程同时从数组中读取).

只要使用互斥锁,你就不用担心了。为什么要刻意制造一个不必要的问题呢?说真的,如果你不想锁定,那么就不应该使用线程。谢谢,我的应用程序使用了太多线程,我希望ap尽可能快地运行,我不知道互斥锁会对性能产生什么影响,实际上是所有互斥锁在一个小内存strcpy块中使用,但我仍然被告知要让它运行得更快…感谢所有善意的回复!!单词撕裂肯定会发生在Alpha处理器上。在x86 CPU上,我相信它只会发生在未对齐的访问中,假设编译器没有做任何有趣的事情。(例如,GCC有时会在读取值后将其写回内存,即使代码没有更改该值。这可能会导致另一个线程的写入丢失。)假设thread2总是读取thread1总是写入的全局双变量g1,这两个线程都处于无限循环中,如果g1现在是1.55,thread1将执行g1=1.66,如果thread2将在没有互斥的情况下以相同的数量读取g1,如果我可以确保g1必须=1.55或1.66,那么我想我将避免使用互斥x!!谢谢…Thread1在无止境循环中写入数据,Thread2也在无止境循环中读取数据,我的目标是获得更高的性能,我关心的是Thread2不会得到奇怪的值,如果该值是正确的值,无论Thread1写得快还是慢,我都不会使用互斥体…因为Thread2只需要尽快得到一个合理的值,我最关心的是令人担忧的是,thread2读取了一个不合理的值,就像我说的,2个字节是在thread1中写入的,而不是在以后的2个字节中完成的,类似这样的。。。
Pthread_mutex_lock(&Mutex1); 
for(idx=0;idx<1000;idx++)
{
     doublexxx = Data1[idx].doubleval ;
     DoSomething(doublexxx) ;
}//for 
Pthread_mutex_unlock(&Mutex1);