【发布时间】:2013-04-29 01:25:43
【问题描述】:
我正在尝试使用 Hoare 的监视器实现证券交易所。
它有两个函数buy()和sell()如下:
buy(procid, ticker, nshares, limit)
sell(procid, ticker, nshares, limit)
并且应该打印有关买方 ID、卖方 ID、股票代码、股票数量和价格的信息。 公平总是得到满足。
我的解决方案的伪代码如下,但并不完整。 它基本上为每个代码使用一个条件变量队列。当卖方进程向证券交易所发送卖出订单时,它会在此队列中进入休眠状态,并且买方进程向卖方进程发出信号,如果条件(匹配价格限制和股票数量)得到满足,它想要购买。
monitor SE {
int available_shares;
int price;
sell(procid, ticker, nshares, limit) {
wait(ticker); // put sell order in ticker queue
available_shares += nshares;
price = limit;
printf("Starting transaction with seller %i", procid);
}
buy(procid, ticker, nshares, limit) {
if (limit <= price && nshares <= available_shares) {
signal(ticker);
available_share -= nshares;
printf("Completing transaction with buyer %i", procid);
printf("Transacting %i %s shares at %i", nshares, ticker, limit);
} else {
wait(ticker); // put buy order in ticker queue
}
}
}
这种方法能否处理多个代码的多个买卖订单?还是会导致死胡同?
【问题讨论】:
-
在我看来,这段代码可能会导致死锁情况,因为您在等待后增加了available_shares变量,所以买家总是会在这种情况下失败,卖家和买家都等待永远
-
很可能是这样。你知道我怎么能解决这个问题吗?或者您能否建议一种不同的实施方式来实施这样的证券交易所?
-
@ladypada boost
lockfree应该会有所帮助,但请注意 stackoverflow.com/questions/14893246/… 顺便说一句:请教我如何存储和处理订单。
标签: concurrency stock mutual-exclusion