代码之家  ›  专栏  ›  技术社区  ›  yan bellavance

将线程与互斥体同步

  •  1
  • yan bellavance  · 技术社区  · 16 年前

    在qt中,我有一个包含互斥锁和解锁的方法。问题是,当互斥体被解锁时,有时需要很长时间才能让另一个线程取回锁。换句话说,即使另一个线程正在等待锁,同一个线程似乎也可以取回锁(在循环中调用的方法)。我该怎么办?一个线程是qthread,另一个线程是主线程。

    3 回复  |  直到 16 年前
        1
  •  4
  •   R Samuel Klatchko    16 年前

    您可以让刚刚解锁互斥体的线程放弃处理器。在POSIX上,您可以通过调用 pthread_yield() Sleep(0) .

    也就是说,不能保证在线程再次唤醒之前,等待锁的线程将被调度。

        2
  •  0
  •   Eugene    16 年前

    如果其他线程已经在等待一个锁,那么就不可能释放该锁,然后再将其取回。

    检查一下你是否真的在你想的时候释放了锁。检查等待线程是否真的在等待(而不是用Trylock测试旋转一个循环,然后睡觉,我实际上做过一次,起初很困惑)。

    或者,如果等待线程真的没有时间到达锁定代码,请尝试qthread::yieldcurrentthread()。这将停止当前线程,并给调度程序一个向其他人执行的机会。可能会导致不必要的切换,这取决于循环的紧密性。

        3
  •  0
  •   Quentin Pradet    14 年前

    如果要确保一个线程优先于另一个线程,可以选择使用 QReadWriteLock . 它适应了一个典型的场景,其中n个线程将在无限循环中读取一个值,只有一个线程对其进行更新。我想这就是你描述的场景。

    QueWrdLeLoCox 提供两种锁定方式: lockForRead() 和 lockForWrite() . 取决于值的线程将使用后者,而更新值的线程(通常通过GUI)将使用前者( 洛克福文字() )并将享有最高优先权。你不需要睡觉、屈服或其他什么。

    示例代码

    假设你有一个 QReadWrite lock; 某处。

    “读者”线索

    forever {
        lock.lockForRead();
        if (condition) {
            do_stuff();
        }
        lock.unlock();
    }
    

    “写入”线程

    // external input (eg. user) changes the thread
    lock.lockForWrite(); // will block as soon as the reader lock ends
    update_condition();
    lock.unlock();