我有一个为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,但最早只需几个月)。