用户级调度和跟踪boost线程

时间:2013-08-02 06:06:10

标签: c++ multithreading boost scheduling

我有一个为Linux编写的C ++应用程序,其中多个boost::thread竞争访问由互斥锁锁定的资源。为了使我的应用程序正常工作,大多数这些线程需要以相当规律的间隔访问资源。一些线程写入/刷新/更新资源,而其他线程用于计算或显示。我可以容忍一些余地/漂移,但不能太多(例如,如果一个线程理想地每隔0.2秒访问一个资源,我可以偶尔等待0.1秒)。

我在下面给出了一个小例子:

pair<int,int> coordinates; //some shared resource (more complex in reality)
boost::mutex m; //mutex controlling access to resource

void Func1() {

  while(1) {
    usleep(1.0*1e6);
    boost::scoped_lock sl(m);
    ComputeUsingCoordinates(coordinates);

  }
}

void Func2() {
  while(1) {
    usleep(1.2*1e6);
    pair<int,int> newCoords = GetCoordinatesAcrossNetwork(); //receives update remotely
    boost::scoped_lock sl(m);
    coordinates = newCoords; //update local value of coordinates
  }
}

void Func3() {
  while(1) {
    usleep(0.5*1e6);
    boost::scoped_lock sl(m);
    Draw(coordinates); //draws coordinates on a screen
  }

}

void OtherComputation () {

  while(1) {
    //Some other computation that doesn't access the common resource, but is nevertheless competing for the CPU
  }

}

int main() {
  boost::thread thread1 = boost::thread(Func1);
  boost::thread thread2 = boost::thread(Func2);
  boost::thread thread3 = boost::thread(Func3);

  // ... other threads not accessing the resource
  boost::thread thread4 = boost::thread(OtherComputation); 
}

目前,我发现有些线程正在挨饿。为了缓解这个问题,我强制每个线程在连续访问资源之间休眠。通过使不同的线程休眠不同的时间,我实施了一个临时调度策略。当有少量线程时,这似乎很有效,但是当我向应用程序的不同部分添加线程时,饥饿问题似乎越来越频繁出现。

有吗:

  • 一种跟踪/收集正在运行的线程数据的方法,以及何时,线程缺乏多长时间等等,以便我可以调整usleep时间间隔
  • 一种控制对互斥锁的访问的方法,以便给定的线程不能过于频繁地连续访问它
  • 在应用程序级别安排不同线程以防止饥饿的其他更好方法

使用实时操作系统/内核不是我的选择。目前,我也不能使用C ++ 11(我们将迁移到C ++ 11,但最早只需几个月)。

0 个答案:

没有答案