线程同步C++

Thread Synchronization C++

本文关键字:C++ 同步 线程      更新时间:2023-10-16

我在线程方面遇到了这个奇怪的问题。在我的mac OS X上,这很好用,但一旦我把它放在运行Ubuntu的桌面上,我就会面临问题。

本质上,我正在做的是:

Function() {
   for(i = 1 to 10)
      while(array not completely changed) {
         pthread_mutex_lock(&lock);
         -- perform actions
         pthread_mutex_unlock(&unlock);
      }
   }
}

我有两个线程在运行这个函数。虽然它应该以这样的方式运行,即:

Thread 1 grabs lock
performs opperations on array
Thread 1 releases lock
Thread 2 grabs lock
performs calculations on array
Thread 2 releases lock

等等,直到阵列已经完成改变,但在Linux上,线程1的所有计算都完成了,然后线程2开始。

所以我会得到:

Thread 1 grabs lock
performs opperations on array
Thread 1 releases lock
Thread 1 grabs lock
performs calculations on array
Thread 1 releases lock
Thread 1 grabs lock
performs calculations on array
Thread 1 releases lock

依此类推,直到数组完全更改,一旦我增加for循环,线程2将执行所有计算并继续此模式。

有人能解释一下发生了什么吗?

您正在经历"饥饿"。偶尔添加一个小的nanosleep调用,给其他线程一个运行的机会。在互斥对之外添加调用(例如,在解锁之后)。线程1正在垄断事物。

您可能还想考虑重组和拆分关键[需要锁定]与非关键工作:

while (more) {
    lock ...
        do critical stuff ...
    unlock ...
    nanosleep ...
    do non-critical stuff
}