マルチスレッドの関数の作成方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

マルチスレッドの関数の作成方法

#1

投稿記事 by dic » 5年前

http://www.kumei.ne.jp/c_lang/intro/no_99.htm
ここを参考にマルチスレッドの勉強をしています。

上のソースではマルチスレッドのスレッドの実行する関数を

コード:

unsigned __stdcall mythread(void *lpx)
{
    int i;
    for (i = 0; i < 4; i++)
        printf("スレッドです[%d]\n", i);
    return 0;
}
と実装していますが、この関数からさらに別の関数
たとえば unsigned mythreadHoge( int i ) を実装するとした場合
usngined __stdcall mythreadHoge( int i );
と __stdcall が必要になってくるのでしょうか?

__stdcall がよくわかっていません。
これはどのような場合につけるのでしょうか?

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: マルチスレッドの関数の作成方法

#2

投稿記事 by dic » 5年前

mythread()から mythreadHoge(int i) を呼び出すとき
mythreadHoge(int i); の実装は
unsinged __stdcall mythreadHoge(int i)
{
...
}
となるのでしょうか?

かずま

Re: マルチスレッドの関数の作成方法

#3

投稿記事 by かずま » 5年前

unsinged __stdcall mythreadHoge(int i)
unsinged __cdecl mythreadHoge(int i)
unsinged mythreadHoge(int i)   // これは __cdecl と同じ

どれでも構いません。

_beginthreadex の第3引数は、__stdcall宣言された関数へのポインタ
でなければなりません。

関数を呼び出すとき、引数をスタックに積みますが、
__stdcall 宣言された関数は、呼び出し元に戻るときに
関数側でスタックを元に戻します。

__cdecl 宣言された関数は、関数側でスタックを元に戻さないので、
戻った後、呼び出し側でスタックを元に戻すコードが必要です。

C++ では宣言なしに関数を呼び出せないので問題ありませんが、
C では、宣言なしに関数を呼び出せるし、double sqrt(); のように
引数の指定がない宣言も許されるので、__stdcall宣言された関数を
__cdecl宣言された関数だと思って呼び出してしまう可能性があります。

そうならないように、__stdcall 宣言された関数はコンパイルされると
関数名の後に @8 のように引数のバイト数が付加された関数名に変更され、
間違ったリンクがされないようになっています。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: マルチスレッドの関数の作成方法

#4

投稿記事 by dic » 5年前

>>かずまさん

丁寧な説明ありがとうございます。
おかげでわかりました。

返信

“C言語何でも質問掲示板” へ戻る