• 締切済み

Linuxのgccでセマフォをやりたい。

gccプログラムでマルチタスクのプログラミングをやっています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2433/trunk/20140411/main.c 以前、H8マイコンに組み込みOSを使用した際に、複数のタスクを動作させている際に、各タスクがwhile(1)で永久ループの状態をしている際に、その永久ループを一時停止するためのロック・アンロック専用のタスクを1つ作って、各タスクのロック・アンロックして動作を制御することをやったことがありました。 確かロックの場合はSempend();というので、アンロックというのはSempost();という物だったと思いました。 例えばTASK1,TASK2,TASK3という3つのタスクを作成し、それぞれを制御したい場合は、 例えばTASK1のセマフォをアンロックしたい場合は Sempost(LockTask1); このようにしたらTASK1が動作し始め、ロックしたい場合はSempend(LockTask1);というようにしたいと思います。 次の例のようなセマフォ制御をLinuxのgccのセマフォプログラミングで行うことは可能でしょうか? どうぞ、ご教示頂きますようお願い致します。 (例) //タスクセマフォ制御用タスク TASK_SEM_CTL() { while(1) { Sempost(LockTask1); delay(1000) //1sec wait Sempost(LockTask2); delay(1000) //1sec wait Sempost(LockTask3); delay(1000) //1sec wait } } TASK1 { while(1) { Sempend(LockTask1); printf("TASK1_done"); Sempost(LockTask1); } } TASK2 { while(1) { Sempend(LockTask2); printf("TASK2_done"); Sempost(LockTask2); } } TASK3 { while(1) { Sempend(LockTask3); printf("TASK3_done"); Sempost(LockTask3); } }

みんなの回答

回答No.1

condition variable を使うのはいかがでしょう。 /* CだとめんどっちーのでC++で軽くやってみた */ #include <iostream> #include <chrono> #include <thread> #include <condition_variable> using namespace std; condition_variable cond; bool work; mutex mtx; unique_lock<mutex> lck(mtx); void worker() { int count = 0; while(true && count < 100) { cond.wait(lck, [&]() { return work; }); // work が true になるまで待機する cout << ++count << endl; this_thread::sleep_for(chrono::milliseconds(30)); } } int main() { work = false; thread thr(worker); // スレッドを起こす for ( int i = 0; i < 10; ++i ) { // 500msごとに止めたり動かしたり this_thread::sleep_for(chrono::milliseconds(500)); work = !work; cond.notify_one(); } work = true; cond.notify_one(); thr.join(); }

techhouse
質問者

お礼

回答頂きありがとうございます。この度は大変返事が遅くなり誠に申し訳ありません。 セマフォが使えるという方法があることがわかり大変助かります。C++でのコーディングで可能とのことで検討していきたいと思っております。またこの問題にこの先出くわすと思いますので、その際にはまたご相談のほどよろしくお願い致します。 大変助かります。

関連するQ&A

専門家に質問してみよう