はじめまして。
複数のタスクで利用されるような関数を作成しようと思っています。
この関数をFuncAとします。
void FuncA()
{
int a;
int b;
int c;
処理1;
処理2;
処理3;
処理4;
}
タスクは優先度低のタスクAと優先度高のタスクBがあるとします。
タスクAがこのFuncAの処理2を行っている最中に、
タスクBがこのFuncAを呼び出すとタスクBで先にFuncA処理をしてから、
タスクAに戻って続きの処理3を行うと思います。
このとき、タスクAで使用していたローカル変数a,b,cはどっかに退避されているのでしょうか?
No.4ベストアンサー
- 回答日時:
>このとき、タスクAで使用していたローカル変数a,b,cはどっかに退避されているのでしょうか?
auto変数はスタックに作成されるので、事実上、退避されるのと同じ。
register変数はコンテキストスイッチで自動的に保存、復元される。
「スレッドセーフな関数」とは「静的またはグローバルな変数を、参照、操作してない関数」なので、静的またはグローバルな変数にアクセスしてればアウト。当然、ポインタを用いて「関数外で確保したメモリ」にアクセスしている場合もアウト。
また「スレッドセーフが保証されてない関数」を呼んでいる場合、自分自身も「スレッドセーフが保証されてない関数」になってしまうので、その場合もアウト。
たいていの「C標準ライブラリ関数」は「スレッドセーフが保証されてない関数」なので「C標準ライブラリ関数を呼んだらアウト」と思って間違いない。
上記のように「変数だけ安全でも、ちっとも安全じゃない」ので、ご注意を。
そういう訳で
・静的またはグローバルな変数を、参照、操作してない
・関数外で確保したメモリを、参照、操作してない
・スレッドセーフが保証されてない関数を呼んでいない
・C標準ライブラリ関数(スレッドセーフが保証されている物を除く)を呼んでいない
なら、両方のタスクから同じ関数を呼ぶ事が出来ます。
No.3
- 回答日時:
自動変数が複数のスレッド間で独立であるかという質問でしょうか。
それとも、実装例についての質問でしょうか。
前者への回答
自動変数は別のスレッドとは干渉しません。(ポインタなどで意図的に共有しない限り)
後者への回答
スレッド間で変数は独立しますが、では関数呼び出し時に退避されるのでしょうか。
自動変数はほとんどの実装で、コールスタックに確保されます。
(コールスタック自体の説明は参考URLで。)
マルチスレッドの場合、このコールスタックをスレッドごとに独立させて用意することになります。そうすると、自動変数は全く関係のない箇所に独立して用意されますので、「退避させる必要はない」のです。
参考URL:http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC% …
No.2
- 回答日時:
FuncAで取っている変数は大丈夫です。
(「int a,b,c」はstaticでは無いので別に取られます)
但し、内部で呼び出す処理で外部スコープの変数(グローバル変数等)を
参照した場合は動作が変わるので「FuncA全体が安全か」は(この情報
だけでは)不明です。
No.1
- 回答日時:
リエントラント・・・懐かしい言葉に思わず出てきました。
リエントラントを要求されるということは、複数のタスク
から1つのモジュールがコピーされないで呼ばれるので、
内部変数があれば、即アウト、です。
タスク毎にテーブルなどを持たせ、その領域を使う仕組み
でなければいけません。
簡単な方法ですと、呼出し引数に作業域を付ける、とかで
す。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel タスク管理のツールのアドバイスをお願いいたします 1 2022/08/07 16:50
- Android(アンドロイド) タスクやTodoのandroidアプリで、リスト上でタスクの登録日時を表示できるものはありませんか? 2 2023/07/17 17:54
- Windows 10 ソフトの実行を自動化したいです。 1 2022/10/15 16:09
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- Windows 10 タスクマネージャーの設定 2 2022/04/04 07:39
- その他(コンピューター・テクノロジー) ChatGPT ExcelVBAの精度は3.5と4で違いはある? 1 2023/04/21 21:00
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- Android(アンドロイド) LINEについて 3 2022/06/18 14:59
- Windows 10 Windowsのタイムスケジューラーについての質問です。 先日、Webスクレイピング用のプログラムを 1 2022/09/28 05:51
- 仕事術・業務効率化 時間管理アプリを探しています。 お知恵のある方にアドバイスを頂きたいと思います。 現在、完全在宅でラ 1 2023/01/18 12:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XCOPYでネットワーク越しにコピ...
-
エミュレータ上での動作の検出
-
タスクスケジューラからショー...
-
ExcelVBAからAccessのモジュー...
-
タスク、プログラム実行後に自...
-
cgiを使ったページが表示さ...
-
バッチファイルからメール作成...
-
Androidアルバムの画像を消去で...
-
拡張子はなぜ、大文字と小文字...
-
フォルダの並び替えの項目を固...
-
エクセルでの計算式もしくはシ...
-
ひとつのファイルを一括で複数...
-
softonicという物をダウンロー...
-
フォルダの中に1個しかファイ...
-
DHCP設定バッチnetshコマンドに...
-
パソコンのスキップとは何ですか?
-
デスクトップのアイコンが黒く
-
DVD-RAMからDVD-Rにコピーする...
-
ファイル名につけてはいけない...
-
ファイルの開き方(拡張子なし)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XCOPYでネットワーク越しにコピ...
-
タスクスケジューラからショー...
-
batファイルをアンダグラウンド...
-
再起動後必ず2つのエラーが出...
-
タスクマネージャーの状態の取...
-
eclipse の TasksにTODO が出ない
-
タスク、プログラム実行後に自...
-
μiTronでの割込み処理について
-
C#からタスクマネージャーの【...
-
タスクの相関図のわかりやすい...
-
VisualStudioで静的コードチェ...
-
username以外でログイン名を知...
-
ログイン前にタスクにて実行し...
-
バッチファイルで、プログラム...
-
VC++6 の CVTRES.EXE について
-
リエントラント関数
-
FTP ダウンロードの中断
-
UACの権限昇格の確認ダイアログ...
-
エミュレータ上での動作の検出
-
一定間隔でメール送信
おすすめ情報