相关疑难解决方法(0)

如何在互斥锁定中优先使用特权线程?

首先:我完全是互斥/多线程编程的新手,所以对于任何错误提前抱歉...

我有一个运行多个线程的程序.线程(通常每个cpu核心一个)进行大量计算和"思考",然后有时他们决定调用更新某些统计信息的特定(共享)方法.通过使用互斥锁来管理统计信息更新的并发性:

stats_mutex.lock();
common_area->update_thread_stats( ... );
stats_mutex.unlock();
Run Code Online (Sandbox Code Playgroud)

现在来问题了.在所有这些线程中,有一个特定的线程几乎需要
实时优先级,因为它是唯一实际运行的线程.

"几乎是实时优先"的意思是:

假设线程t0是"特权者"而t1 .... t15是正常的.现在发生的是:

  • 线程t1获得锁定.
  • 线程t2,t3,t0调用lock()方法并等待它成功.
  • 线程t1调用unlock()
  • 线程t2,t3,t0中的一个(随机地,据我所知)成功获得锁定,而其他线程继续等待.

我需要的是:

  • 线程t1获得锁定.
  • 线程t2,t3,t0调用lock()方法并等待它成功.
  • 线程t1调用unlock()
  • 线程t0获得锁定,因为它具有特权

那么,做这件事的最好(可能是最简单的)方法是什么?

我想的是有一个名为"privileged_needs_lock"的bool变量.

但我想我需要另一个互斥锁来管理对这个变量的访问...我不知道这是不是正确的方法......

附加信息:

  • 我的线程使用C++ 11(从gcc 4.6.3开始)
  • 代码需要在Linux和Windows上运行(但目前仅在Linux上进行测试).
  • 锁定机制的性能不是问题(我的性能问题是在内部线程计算中,并且线程数总是很低,每个cpu核心最多一个或两个)

任何想法都表示赞赏.谢谢


以下解决方案有效(三个互斥方式):

#include <thread>
#include <iostream>
#include "unistd.h"

std::mutex M;
std::mutex N;
std::mutex L;

void lowpriolock(){
  L.lock();
  N.lock();
  M.lock();
  N.unlock();
}

void lowpriounlock(){
  M.unlock();
  L.unlock();
}

void highpriolock(){
  N.lock();
  M.lock();
  N.unlock();
}

void highpriounlock(){
  M.unlock();
}

void hpt(const char* s){
  using namespace std;
  //cout << "hpt trying to get …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mutex c++11

24
推荐指数
2
解决办法
1万
查看次数

标签 统计

c++ ×1

c++11 ×1

multithreading ×1

mutex ×1