C++ 线程同步C++;

C++ 线程同步C++;,c++,arrays,multithreading,pthreads,C++,Arrays,Multithreading,Pthreads,我有一个关于线程的奇怪问题。在我的mac和OSX上,这很好,但一旦我把它转到运行Ubuntu的桌面上,我就面临着问题 基本上,我所做的是: Function() { for(i = 1 to 10) while(array not completely changed) { pthread_mutex_lock(&lock); -- perform actions pthread_mutex_unlock(&

我有一个关于线程的奇怪问题。在我的mac和OSX上,这很好,但一旦我把它转到运行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
}
你正在经历“饥饿”。偶尔添加一个小的
nanosleep
调用,让其他线程有机会运行。在互斥对之外添加调用(例如,在解锁之后)。线程1是独占的东西

你也可以考虑重组和拆分关键的(需要锁定)与非关键性工作:

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

您感兴趣的是线程调度程序。看看这个。从3.14版开始,Linux提供了一个截止日期调度策略(SCHED_deadline)。您可能对循环策略感兴趣。注意,我们在当前的C++标准中有<代码> STD::线程< /代码>类,它应该比 pStult>代码>本地库API更好。如果您想强制切换到特定线程,则需要自己管理该线程。否则,哪个线程将获得锁是完全随机的(不是它们到达锁的顺序)。您感兴趣的是线程调度程序。看看这个。从3.14版开始,Linux提供了一个截止日期调度策略(SCHED_deadline)。您可能对循环策略感兴趣。注意,我们在当前的C++标准中有<代码> STD::线程< /代码>类,它应该比 pStult>代码>本地库API更好。如果您想强制切换到特定线程,则需要自己管理该线程。否则,哪个线程将获得锁是完全随机的(不是它们到达锁的顺序)。我将把这个
nanosleep
放在我的代码中的什么位置?在锁被释放后,但在重新获得它之前。将第一个线程置于休眠状态将允许第二个线程有时间获取锁等。在释放锁后但重新获取锁之前,我将在代码中放置此
nanosleep
。将第一个线程置于睡眠状态将允许第二个线程有时间获取锁等。