→ Hazukashiine: 也許可以考慮改用 mutex 來實踐 09/01 16:13
→ Hazukashiine: 記得要處理好 deadlock 的問題就好了 09/01 16:14
→ jaw109: @Hazukashiine 您是指POSIX mutex? 這可以在interprocess 09/01 16:32
→ jaw109: 使用嗎? 09/01 16:32
→ Hazukashiine: 你是說 IPC 嗎?我不確定,不過你可以先自己找一下 09/01 16:34
→ shadow0326: google一下pthread wait broadcast 09/01 18:54
推 yvb: 看起來 semaphore 就可以辦到了啊. 09/01 19:53
推 ah7675: reader writer lock? 09/01 23:35
→ Caesar08: 如果你一次只會加1個,我認為condition_variable就夠用 09/02 19:16
→ Caesar08: 不過你說一次會加多個,那應該要用semaphore 09/02 19:17
→ Caesar08: readers writers的問題應該符合你的需求 09/02 19:18
推 clementchen: 你想做的可能是disruptor pattern..請自查:) 09/02 19:30
→ firejox: monitor ? 09/03 03:30
我利用semaphore做成這樣:
semaphore剛建立出來的時候, 把semaphore的值設為0 (這樣任何想要-1的client都會被卡住)
在server端想要送一個signal給所有卡住的client時, 就這樣做
semctl(id, 0, SETVAL, 100); // 這會讓所有卡住的client unlock
semctl(id, 0, SETVAL, 0); // 恢復為常態, 讓下次想要lock的client會立刻卡住
在client端就只是單純的-1而已
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = -1;
sb.sem_flg = 0;
semop(id, &sb, 1);
※ 編輯: jaw109 (114.32.91.30), 09/03/2015 12:41:06
→ yvb: 請試著考慮 sem_op = 0 可以怎麼使用. 09/03 16:28
感謝yvb的指點, 我改成這樣了
semaphore剛建立出來的時候, 把semaphore的值設為1 (這樣任何想要做sem_op = 0的client都會被卡住)
在server端想要送一個signal給所有卡住的client時, 就這樣做
semctl(id, 0, SETVAL, 0); // 這會讓所有卡住的client unlock
semctl(id, 0, SETVAL, 1); // 恢復為常態, 讓下次想要做sem_op=0的client會立刻卡住
在client端就做sem_op=0
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = 0;
sb.sem_flg = 0;
semop(id, &sb, 1);
[A
※ 編輯: jaw109 (114.32.91.30), 09/03/2015 18:11:55
→ adrianshum: Reader Writer Lock 就可以了。Client acquire 09/06 22:01
→ adrianshum: read lock, server acquire write lock 09/06 22:02
→ jaw109: 我自己其實有實作read-write lock, 但改成文中的需求並不 09/07 14:51
→ jaw109: 適合 09/07 14:51
→ ah7675: condition variable + wait_queue 09/08 23:25