b*****n 发帖数: 2324 | 1 两个process,一个输出苹果,一个输出橘子,要求两个process必须take turns。
要求不能有busy waiting。 |
b*****n 发帖数: 2324 | |
L*****1 发帖数: 34 | 3 被问过一道一样的题目,不过是foo和bar,转一个大神的解答:
Semaphore sem1=new Semaphore(1);
Semaphore sem2=new Semaphore(0); //only when permit number is bigger
than 0
void functionFoo() {
while(1){
sem1.acquire();
System.out.print("Foo");
sem2.release();
}
}
void functionBar() {
while(1) {
sem2.acquire();
System.out.print("Bar");
sem1.release();
}
}
sem2=0 确保一上来block
sem1=1 确保第一次不会block
require就是-1
release就是+1 |
p*****2 发帖数: 21240 | 4
这个就是ping pong吧。可以用akka做。
【在 b*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 两个process,一个输出苹果,一个输出橘子,要求两个process必须take turns。 : 要求不能有busy waiting。
|
l********s 发帖数: 358 | 5 这个解法不错。不用busy waiting一般就是在condition variable上面await &
notification,忘了Semaphore也有signaling的作用。
如果可以用Go的话,用channel很容易实现。类似在java里面用blockingQueue也可以,
一个blockingQueue放apple,一个blockingQueue放orange。开始的时候apple的
blockingQueue里面有一个apple,orange的blockingQueue里面是空。然后拿一个apple
后放orange,拿一个orange放一个apple。
【在 L*****1 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 被问过一道一样的题目,不过是foo和bar,转一个大神的解答: : Semaphore sem1=new Semaphore(1); : Semaphore sem2=new Semaphore(0); //only when permit number is bigger : than 0 : void functionFoo() { : while(1){ : sem1.acquire(); : System.out.print("Foo"); : sem2.release(); : }
|
k*******a 发帖数: 433 | |
g*********e 发帖数: 14401 | 7 sem_t sm
sm.capacity=1
sm.init=0
thread 1:
while 1
sm.up
"apple"
thread 2:
while 1
sm.down
"orange" |
m*****k 发帖数: 731 | 8 +1
actually same idea in essence as Logan91's
apple
【在 l********s 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个解法不错。不用busy waiting一般就是在condition variable上面await & : notification,忘了Semaphore也有signaling的作用。 : 如果可以用Go的话,用channel很容易实现。类似在java里面用blockingQueue也可以, : 一个blockingQueue放apple,一个blockingQueue放orange。开始的时候apple的 : blockingQueue里面有一个apple,orange的blockingQueue里面是空。然后拿一个apple : 后放orange,拿一个orange放一个apple。
|
m*****k 发帖数: 731 | |
I*******d 发帖数: 108 | 10 二爷用的技术好新。。膜拜
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 这个就是ping pong吧。可以用akka做。
|
g*****g 发帖数: 34805 | 11 It says 2 processes, not 2 threads. Just send a message back and force. No
need to sync. |
p******2 发帖数: 86 | 12 进程的怎么写?
写个来看看吧
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : It says 2 processes, not 2 threads. Just send a message back and force. No : need to sync.
|
m*****k 发帖数: 731 | 13 same idea , old school way,
replace the blockingQueue to real msgQ like rabbitMQ,
or buzz word like kafka |
b*********0 发帖数: 53 | 14 另一种解法,多进程的话把shared data放到share memory就可以
int flag = 0;
mutex mtx;
bool run = true;
void Foo() {
while (run) {
lock_guard lock(mtx);
if (flag == 0) {
cout << "Foo";
flag = 1;
}
}
}
void Bar() {
while (run) {
lock_guard lock(mtx);
if (flag == 1) {
cout << "Bar";
flag = 0;
}
}
}
【在 b*****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 两个process,一个输出苹果,一个输出橘子,要求两个process必须take turns。 : 要求不能有busy waiting。
|