我对使用基于pthreads和Ubuntu开发环境的线程的最新gcc中的互斥和消息传递的性能感兴趣.一个很好的通用问题是餐饮哲学家,每个哲学家都使用lh和rh fork与左手和右手邻居共享.我将哲学家的数量增加到99,以保持我的四核处理器繁忙.
int result = try_lock(forks[lhf], forks[rhf]);
Run Code Online (Sandbox Code Playgroud)
上面的代码允许我的哲学家试图抓住他们需要吃的两把叉子.
// if the forks are locked then start eating
if (result == -1)
{
state[j] = philosophers::State::Eating;
eating[j]++;
if (longestWait < waiting[j])
{
longestWait = waiting[j];
}
waiting[j] = 0;
} else {
state[j] = philosophers::State::Thinking;
thinking[j]++;
waiting[j]++;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码监视我的哲学家进步吃或思考取决于他们是否设法保留两把叉子.
{
testEnd te(eating[j]+thinking[j]-1);
unique_lock<mutex> lk(cycleDone);
endCycle.wait(lk, te);
}
Run Code Online (Sandbox Code Playgroud)
在这段时间之后,上述代码等待所有哲学家完成选择,哲学家可以自由地进行新的尝试:
if ( philosophers::State::Eating == state[j] )
{
state[j] = philosophers::State::Thinking;
forks[lhf].unlock();
forks[rhf].unlock();
}
Run Code Online (Sandbox Code Playgroud)
我有一个主线程,监视哲学家,并将他们从一个周期移动到下一个周期,让他们大约10秒吃,并尽可能多地思考.结果是大约9540个周期,一些哲学家挨饿,其他人有足够的食物和大量的思考时间!因此,我需要保护我的哲学家免于饥饿和等待太久,所以我增加了更多的逻辑来防止过度饮食,要求饮食哲学家释放和思考,而不是在经过一个小小的休息后抓住相同的叉子:
// protect the philosopher against starvation
if (State::Thinking == …Run Code Online (Sandbox Code Playgroud)