c - 不使用互斥锁保护双变量

标签 c multithreading gcc mutex

问候!!

我有一个在 Linux 中运行的 c ap,它是一个 POSIX 多线程应用程序, 在线程 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 ,如果 thread1 正在设置 Data1[33].doubleval 而 thread2 正在读取 Data1[33].doubleval ,Data1[33].doubleval 会是一个非常奇怪的值吗?值(value) ?我的意思是,例如, double var 有 4 个字节,而 thread1 正在设置 Data1[33].doubleval 前 2 个字节,而不是完成后 2 个字节,此时 thread2 正在尝试读取 Data1[33].doubleval ....可能吗?

如果可能的话,我该如何保护双变量而不出现此类问题? 互斥体很好用,我只是想知道是否有另一种方法来保护双变量 哪个线程1正在写入其中,至少线程2尝试从同一个变量中读取 将等待 4 个字节的 double var 完成!!!

最佳答案

是否可以读取“部分写入”的值取决于很多因素(例如目标系统和对齐方式)并且绝对不可移植。例如,假设此代码在 16 位 CPU 上运行,并在软件中模拟了浮点支持。

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

我怀疑您的设计存在更高级别的问题 - 也许您应该使用条件变量使第二个线程等待,直到第一个线程写入。

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

关于c - 不使用互斥锁保护双变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9372474/

相关文章:

c++ - 全局更改 gcc 包含路径

c - 如何使用 GCC 取消引用零地址?

c - 分配二维字符数组

c - 为以下代码分配了多少空间?

c# - 如何从 Windows 服务运行 exe 并在 exe 进程退出时停止服务?

c - 在 ubuntu 上使用 berkeleydb - 找不到 db 库

c++ - 异步 FTP 库

C + UNIX,siglongjmp 和 sigsetjmp

c++ - 无锁有界堆栈 C++11 原子

c - C 套接字上的线程同步