p****2 发帖数: 387 | 1 问题: What is wrong with the following code?
public void shelfStock(BookShelf shelf)
{
while (true)
{
Book book = GetBookForShelf();
if (shelf.Count == shelf.Capacity - 1)
Thread.Sleep(shelfStockThread);
shelf.Add(book);
shelf.Count++;
if (shelf.Count == 1)
Thread.WakeUp(shelfClearThread);
}
}
public void shelfClear(BookShelf shelf)
{
while (true)
{
if (shelf.Count == 0)
sleep();
|
k***g 发帖数: 75 | 2 shelf.Count需要锁保护吧,这里显然是两个进程在操作shelf,一个往上放,一个往下
拿。
【在 p****2 的大作中提到】 : 问题: What is wrong with the following code? : public void shelfStock(BookShelf shelf) : { : while (true) : { : Book book = GetBookForShelf(); : if (shelf.Count == shelf.Capacity - 1) : Thread.Sleep(shelfStockThread); : shelf.Add(book); : shelf.Count++;
|
b**f 发帖数: 20 | 3 when shelf.Count reaches shelf.Capacity - 1, shelf stock will sleep forever. |
p****2 发帖数: 387 | 4 我也提到过,interviewer回答即便这样也是错的。
【在 k***g 的大作中提到】 : shelf.Count需要锁保护吧,这里显然是两个进程在操作shelf,一个往上放,一个往下 : 拿。
|
p****2 发帖数: 387 | 5 你是说我的code?
forever.
【在 b**f 的大作中提到】 : when shelf.Count reaches shelf.Capacity - 1, shelf stock will sleep forever.
|
k***g 发帖数: 75 | 6 我觉得基本上要建立起一个critical section,基本上保证add和count的增加都不会受
到干扰。但是还要考虑会不会出现两个线程同时都进入睡眠的情况,有另一个线程的代
码吗?
【在 p****2 的大作中提到】 : 我也提到过,interviewer回答即便这样也是错的。
|
k***g 发帖数: 75 | 7 比如说如果capacity只有1,架子上只能临时放一本书,是不是两个线程都会睡?
【在 k***g 的大作中提到】 : 我觉得基本上要建立起一个critical section,基本上保证add和count的增加都不会受 : 到干扰。但是还要考虑会不会出现两个线程同时都进入睡眠的情况,有另一个线程的代 : 码吗?
|
p****2 发帖数: 387 | 8 这两个函数分别在两个不同的thread里。
【在 k***g 的大作中提到】 : 我觉得基本上要建立起一个critical section,基本上保证add和count的增加都不会受 : 到干扰。但是还要考虑会不会出现两个线程同时都进入睡眠的情况,有另一个线程的代 : 码吗?
|
p****2 发帖数: 387 | 9 你说的这种感情况在原code里会出现,在新code里似乎出现不了。
还有,shelfStock函数里有如下错误:
if (shelf.Count == 1) \\ <-- should be "== 0"
Thread.Sleep(shelfClearThread);
【在 k***g 的大作中提到】 : 比如说如果capacity只有1,架子上只能临时放一本书,是不是两个线程都会睡?
|
c*******d 发帖数: 255 | 10 我觉得原code逻辑比较混乱
上面应该是"== shelf.Capacity"
我觉得上面应该是 "== shelf.Capacity"
我觉得上面应该是 "== 0"
【在 p****2 的大作中提到】 : 问题: What is wrong with the following code? : public void shelfStock(BookShelf shelf) : { : while (true) : { : Book book = GetBookForShelf(); : if (shelf.Count == shelf.Capacity - 1) : Thread.Sleep(shelfStockThread); : shelf.Add(book); : shelf.Count++;
|
|
|
k***g 发帖数: 75 | 11 我没看见你改的部分,刚看到,我觉得好像是改错了,为啥要改那个睡和唤醒的顺序?
【在 p****2 的大作中提到】 : 你说的这种感情况在原code里会出现,在新code里似乎出现不了。 : 还有,shelfStock函数里有如下错误: : if (shelf.Count == 1) \\ <-- should be "== 0" : Thread.Sleep(shelfClearThread);
|
k***g 发帖数: 75 | 12 你的修改明显是错的,原来的睡眠唤醒顺序是正确的
public void shelfClear(BookShelf shelf)
{
while (true)
{
if (shelf.Count == 0)
Thread.WakeUp(shelfStockThread);
lock(shelf) {
shelf.RomoveBook(shelf.GetBook());
shelf.Count--;
}
看这儿修改过的代码,如果Count是0,唤醒shelfStock(这个线程未必睡眠),然后就
锁定书架取书,将Count减一,Count就是-1了。
【在 p****2 的大作中提到】 : 你说的这种感情况在原code里会出现,在新code里似乎出现不了。 : 还有,shelfStock函数里有如下错误: : if (shelf.Count == 1) \\ <-- should be "== 0" : Thread.Sleep(shelfClearThread);
|
p****2 发帖数: 387 | 13 就是说原代码是对的了。
【在 k***g 的大作中提到】 : 你的修改明显是错的,原来的睡眠唤醒顺序是正确的 : public void shelfClear(BookShelf shelf) : { : while (true) : { : if (shelf.Count == 0) : Thread.WakeUp(shelfStockThread); : lock(shelf) { : shelf.RomoveBook(shelf.GetBook()); : shelf.Count--;
|
s********f 发帖数: 510 | 14 源代码也不对。
【在 p****2 的大作中提到】 : 就是说原代码是对的了。
|
p****2 发帖数: 387 | |
s********f 发帖数: 510 | |