c - 多个线程如何更改互斥锁定的静态变量

时间:2016-06-20 07:21:11

标签: c pthreads mutex

作为线程的初学者,我很难理解互斥体的逻辑是如何工作的。需要帮助了解多线程在以下代码段中的工作原理以及每x次调用foo()的输出结果:

foo()
{
  static int x;
  X_lock();     //locking
  x++;
  X_unlock;     //unlocking
  return x;
}

信号量和互斥量之间的基本区别是什么?一个简单的例子就是不错的。

1 个答案:

答案 0 :(得分:1)

有时线程需要使用相同的资源,并且可以调用未识别的行为。例如,添加不是原子操作,因此可能导致此问题。所以在不同的线程之间需要某种 barrier ,只有一个线程可以通过该屏障,而其他线程必须等待该线程完成,一个线程完成后,接下来通过屏障等等必须等待线程完成。

这是竞争条件的一个示例,并且MUTEX(互斥)用于此。互斥是如何工作的?首先,你必须在主函数中初始化互斥锁

pthread_mutex_init(&lock, NULL).

变量pthread_mutex_t lock;是全局的,因此每个线程都可以访问它。之后,一个主题将锁定互斥锁

pthread_mutex_lock(&lock);

现在,下一个线程也出现在同一点上,我刚刚编写的代码行,并且无法通过它。所以每个其他线程都必须等待这个障碍 - 这行代码,直到第一个线程解锁互斥

pthread_mutex_unlock(&lock);

然后根据哪个线程从OS获取处理器时间将通过障碍,同样的事情重复一遍。

互斥是非常重要的概念。至于信号量,它们用于相同的事情,线程同步,here是涵盖这个主题的优秀文章。