Multithreading 我不明白为什么有必要用互斥来保护单个指令设置程序

Multithreading 我不明白为什么有必要用互斥来保护单个指令设置程序,multithreading,concurrency,thread-safety,race-condition,thread-synchronization,Multithreading,Concurrency,Thread Safety,Race Condition,Thread Synchronization,我有一个这样做的源代码: void setX(int x) { pthread_mutex_lock(m_lock); m_x = x; pthread_mutex_unlock(m_lock); } 此方法由多个线程并发执行 我已经读到有必要使用互斥来保护它,使其线程安全,但我不明白为什么有必要这样做。 据我所知,由于该方法只执行一条指令,因此无论是否使用互斥锁,它都将始终是原子的(线程安全的) 因此,我的问题是:有没有任何方法可以让上面的方法在没有互斥的情况下生成竞争条件?这取

我有一个这样做的源代码:

void setX(int x) {
  pthread_mutex_lock(m_lock);
  m_x = x;
  pthread_mutex_unlock(m_lock);
}
此方法由多个线程并发执行

我已经读到有必要使用互斥来保护它,使其线程安全,但我不明白为什么有必要这样做。

据我所知,由于该方法只执行一条指令,因此无论是否使用互斥锁,它都将始终是原子的(线程安全的)


因此,我的问题是:有没有任何方法可以让上面的方法在没有互斥的情况下生成竞争条件?

这取决于上下文。在大多数语言/系统中,给字段赋值是一个原子操作

但理论上,这并不能保证。如果您的系统只能处理8位字节,那么分配2或4字节的int值将不是原子的

一旦你把变量/字段的类型从int改为long,所有的赌注都被取消了。从这个意义上讲,上述代码过于“保守”。但它有一个优点:如果您决定将该字段/参数的类型更改为无法原子分配的类型,则无需进一步更改


因此:您是正确的-这里不需要使用互斥。但这也不会造成任何伤害(可能除了允许死锁或由于增加获取锁的需要而影响性能的情况除外)。

使用互斥锁的原因可能是为了确保分配对其他线程可见。我不知道在你的例子中是C还是C++代码,我不知道C或C++的什么版本。

在C和C++的早期版本中,语言的内存模型是实现定义的行为,但是在后来的版本中,语言规范规定了一个内存模型,我相信它有点像java程序的内存模型。 在Java中,如果线程A在不使用任何锁定的情况下为普通

int
变量分配一个值,然后线程B随后检查该变量,也没有锁定,那么线程B可以看到线程A分配的值,或者可以看到之前的值。无法保证线程B何时(甚至是否)能够看到新值

如果线程使用互斥锁,情况会发生变化。在这种情况下,规则是线程A在解锁互斥锁之前写入变量的任何内容都将在线程B锁定同一互斥锁后对线程B可见