こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

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);
}

}

投稿日時 - 2014-06-21 20:37:04

QNo.8647777

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

ANo.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();
}

投稿日時 - 2014-06-21 21:56:25

お礼

回答頂きありがとうございます。この度は大変返事が遅くなり誠に申し訳ありません。

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

大変助かります。

投稿日時 - 2014-07-22 11:16:03

-広告-
-広告-
-広告-
-広告-