• ベストアンサー

Cランタイムライブラリ

まだWINDOWSプログラミングを始めて間もない初心者です。 宜しくお願い致します。 マルチスレッドの動作確認をする際に簡単なソースを作る過程で、1つ疑問が浮かびました。 CreateThreadについてMSDNのサイトを見ると、 ”C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。” とあるのですが、この関数はCのランタイムライブラリに属する、この関数はCのランタイムライブラリに属さない、というのは、例えばどこかのサイトを見れば分かるものなのでしょうか? あと、”わずか”、というのがどの程度を指しているのか良く分かりませんが、”わずかなメモリリークが発生”すると、具体的には何が起こるのでしょうか? どなたか分かる方ご教授下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • jx-word
  • ベストアンサー率40% (38/94)
回答No.3

ちょっと間違ってましたね。↓を参照してください。 http://msdn.microsoft.com/ja-jp/library/634ca0c2.aspx このURL、そのまま貼っても大丈夫なのかぁ。

supertrap
質問者

お礼

有難う御座いました。 まさに欲しかった情報そのものです。 お手数をおかけしました。 >このURL、そのまま貼っても大丈夫なのかぁ。 うーん… 他の方の回答にも、参考URLとして、URLそのままを貼ってあるのを結構見かけます。 そのものずばりのご回答、どうも有難う御座いました。

その他の回答 (2)

  • jx-word
  • ベストアンサー率40% (38/94)
回答No.2

Cのランタイムライブラリ(CRT)とは、Win32APIではないC言語の標準ライブラリなどのことを指します。 詳細は http://msdn.microsoft.com/ja-jp/library/default.aspx から下記をたどってください。 MSDN ライブラリ ↓ 開発ツールと言語ドキュメント ↓ Visual Studio 2008 ↓ Visual C++ ↓ Visual C++ のリファレンス ↓ ランタイム ライブラリ ↓ C ランタイム ライブラリ なお、ヘルプのCreateThreadの項は英語版の方は更新されていて、該当の箇所は下記のようになっています。 > A thread in an executable that calls the C run-time library (CRT) > should use the _beginthreadex and _endthreadex functions for > thread management rather than CreateThread and ExitThread; > this requires the use of the multi-threaded version of the CRT. > If a thread created using CreateThread calls the CRT, the CRT > may terminate the process in low-memory conditions. というわけで、メモリリークをするわけではなく、メモリが少ない場合に異常終了するようです。 MSDNライブラリは日本語版は誤訳があったり更新されていなかったりするので、 悩んだ場合は英語版を見てみるのがお勧めです。

supertrap
質問者

補足

遅くなりました。 回答有難う御座いました。 1)ライブラリについて 遅くなって申し訳ないのですが、もしご存知でしたら、折角の機会なので教えて下さい。 教えていただいたリンク先を見ると、 libcmt.lib、msvcrt.lib、libcmtd.lib などがあるのですが、これらのファイルの中身に入っている関数名を見る方法はあるのでしょうか? 自分のイメージとしては、これらのファイルの中に、例えばstrcpy関数とかatoi関数などが入っているのかなあと想像しているのですが。 2)英語版について 自分は英語は苦手ですが、この程度なら何とか理解出来そうです。 英語版を見るとこまでは頭が回りませんでした。 貴重な情報有難う御座います。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

お使いのC/C++環境が VisualC++なのでしたら 付属のMSDNで VisualC++の リファレンス > ライブラリ リファレンス > ランタイムライブラリ などを参照してみてください VC++の場合 6.0までは ランタイムライブラリのヘッダーファイルとWindowsの標準ライブラリヘッダーファイルは includeフォルダに登録されていました VC++7.0以降はランタイムがinclude、Windows側がPlatformSDK\includeと分離されています stdio.h, stdlib.h, string.h, math.h などがランタイム側です

supertrap
質問者

お礼

遅くなりました。 回答有難う御座いました。 自分の使っている環境はVC++6.0とXPSP2です。 CD(DISC2)を見てみたのですが、今一検索がうまくかかりませんでした… 折角教えて下さったのに申し訳有りません。 ただ、stdio.h, stdlib.h, string.h, math.h と具体的にヘッダファイルを書いてくださったので、そこから追うことで、目的を達成出来ます。 有難う御座いました。

関連するQ&A

  • メンバ関数(メソッド)をマルチスレッドにしたい

    環境はWinXPでVisual Studio 2005を使用しています。 C言語で関数をマルチスレッド化するにはこんな感じでOKでした。 // マルチスレッド関数 void Thread( void * ) { } void MainFunc() {   (HANDLE)_beginthread( Thread, 0, NULL ); } こんな風にスレッド関数をC++のメソッドに変えてうまくいくかと思い class Test_c { public:   void Thread( void * ); } ; // マルチスレッド関数 void Test_c::Thread( void * ) { } void MainFunc() {   Test_c t t;   (HANDLE)_beginthread( t.Thread, 0, NULL ); } とするとエラーが出てきてしまい、コンパイルが通りませんでした。 C++のメンバ関数をマルチスレッド関数としたい場合はどの様に書けばよいのでしょうか・・?

  • C#のクラスライブラリ

     はじめまして。  C#を使っています。.netframworkのクラスライブラリやwin32apiについて詳しく書いてあるサイトを教えていただけませんか。msdn以外でお願いします。

  • MSDNライブラリのダウンロード

    テキスト編集ツールでWin32 APIを使ったプログラミングをしているのですが、そのときにいつもMSDN Libraryで関数を毎回調べながら作業を行っています。 なのでネットに繋げない環境ではMSDN Libraryに接続できなく、作業ができません。(けっこうそういう環境でPC触ることも多いです) ちょっと見てみたんですけど、一括ダウンロードというのはMSDN Libraryでは見つけれませんでした(情報量が多すぎてどうやって探せばいいのかわからないというのが本音です)。 MSDN Libraryの情報の一括ダウンロードなどは提供されていないのでしょうか? また、そうだとした場合、オフラインで作業をする手段はありますか?あったら教えてください。

  • _beginthread()の使用について

    元々スレッドの生成を CreateThread(NULL, 0, ThreadFunc, (LPVOID)&param, 0, &dwID); としていたのですが、 生成したスレッドがC言語のライブラリを利用する場合、 CreateThread()ではなく_beginthread()を使うとMSDNに記載されていました。 そこでプログラムを_beginthread()に書き換えたのですが、 『error C2440: '関数' : 'DWORD (__stdcall *)(LPVOID)' から 'void (__cdecl *)(void *)' に変換できません。』 『warning C4024: '_beginthread' : の型が 1 の仮引数および実引数と異なります。』 とのエラーが表示されてしまいます。 アドバイスをよろしくお願いします。 #include <windows.h> #include <process.h> #define APP_NAME TEXT("Sample_MainWindow") typedef struct _ThreadParam {   HWND owner;   POINT point; } ThreadParam; DWORD WINAPI ThreadFunc(LPVOID vdParam) {      ・     (省略)      ・ } LRESULT CALLBACK WindowProc(   HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {   ThreadParam param;   switch(uMsg) {     case WM_LBUTTONDOWN:       param.owner = hWnd;       param.point.x = LOWORD(lParam);       param.point.y = HIWORD(lParam);       _beginthread(ThreadFunc, 0, &param);       return 0;     }   return DefWindowProc(hWnd, uMsg, wParam, lParam); }

  • C言語のライブラリで"A"を20文字生成する関数名を知りたいです。

    C言語のライブラリで"A"を20文字生成する関数名を知りたいです。 C言語やVBなどのプログラミングで良く関数やライブラリとして存在している名前を調べる良いサイトを知っている方はいらっしゃいますか?

  • ライブラリのコンストラクタについて。

    はじめまして。 C++のライブラリ(静的、動的問わず)について いくつか教えてください。 たとえば、1つのクラスで定義した以下のようなライブラリ (まずは、静的 or 動的は問いません)があるとします。 class library { library(); ~library(); public GetX(); private  int a; } さらに、実行プログラムMain.exeが存在し、このMain.exeは、 上記ライブラリをリンクしているものとします。 このとき、Main.exe内では、libraryをnewすることもなく、 library::GetX();と呼べるわけですが、 (1)コンストラクタはいつ呼ばれているのでしょうか? (2)(1)に関係しそうですが、Main.exeがマルチスレッドの場合に、    Main threadとsub threadから呼ぶときに、ライブラリのコンテキスト?インスタンス?は    同じなのでしょうか?それともスレッドごとに作られるのでしょうか? ご存知のかたいらっしゃいましたら教えてください。 説明不足があればご指摘ください。宜しくお願いいたします。

  • マルチスレッド

    ウインドウズプログラミングを始めて1ヶ月弱の初心者です。 色々探してみたのですが、結局良く分かりませんでした。 宜しくお願いします。 以下のリンクにおいて、 http://wisdom.sakura.ne.jp/system/winapi/win32/win143.html 1)主スレッドとは、具体的にソースファイルのどこからどこまでのことを言うのでしょうか? そもそもスレッドとは何でしょうか?関数のことでしょうか? また、タスクとは、実行ファイルと考えて良いのでしょうか? 2)副スレッド(ThreadFunc)を作成すると、主スレッド(WinMain?)と副スレッドで並列処理をするとのことですが、CPUは普通一つしかないので、実際は、主スレッド(WinMain?)と副スレッドを常に切り替えながら動作すると思います。が、ここで疑問なのですが、主スレッドと副スレッドの切り替えはいつ誰が行うのでしょうか?また、切り替えタイミング(例えば1ms毎に切り替えたいとか)は自由に設定出来るのでしょうか? 3)"マルチスレッドは親プロセスのメモリ空間を共有します" とあるのですが、これは CreateThread(NULL , 0 , ThreadFunc , (LPVOID)hWnd , 0 , &dwID) の(LPVOID)hWnd を、副スレッド(ThreadFunc)に引数として渡しているから、つまり、主スレッドと副スレッドは、(LPVOID)hWnd だけがメモリを共有する、ということでしょうか? 主スレッドと副スレッドでメモリを共有すると、どんなメリットがあるのでしょうか? 4)マルチスレッドはこういう時に使うとよい、 というような大まかな判断基準があれば教えて下さい。 分かり辛い質問で申し訳有りません。宜しくお願い致します。

  • ライブラリ作成時のグローバル変数の対応(C言語)

    C言語を用いてライブラリを作成しています。 ライブラリは機能ごとにファイルを分けています。 今、ライブラリの中でのみ使用するグローバル変数やグローバル関数が必要になりました。 このグローバル変数や関数は複数ファイルで参照するため、static宣言はできません。 しかし、このグローバル変数や関数は公開する必要はありません(ライブラリの中でのみ使用します)。 このようなことをC言語で実現するためにはどうしたらよいのでしょうか? 開発環境は Windows7 VisualC++2010 です。 VisualC++2010を使うなら C++で書けばいいのではないかといわれそうですが、 C言語でプログラミングしたいのです。 以下のようなサイトがあったのですが、これを使うしかないでしょうか? http://0xcc.net/blog/archives/000108.html

  • マルチスレッド化。

    今とても大きな配列を使用し、長時間処理をするプログラムを組んでいます。元々処理時間に1時間を要するプログラムを2分で処理を完了するまでに仕上げました。 しかし、探究心はおさまらずもう少し高速化に挑みたいと考えています。 過去に「猫でもわかる」のSDK第1章と2章を学び、マルチスレッドのプログラムをSDKで組んだことがあります。それを利用してマルチスレッド化を実現したいと考えています。 言語はCでVisualStudio2005を使用しています。 *疑問1   SDKの場合WinMain関数とプロシージャからの実行で_beginthread関数を記述すれば処理が開始されます。 Cでもmain関数内に記述すれば、SDKと同様に処理できるのでしょうか? *疑問2 _beginthread関数の引数に関してです。 第1引数にvoid型のスレッド関数、第2引数に0?、そして第3引数にはスレッド関数に渡すデータの引数を記述すると把握しているのですが、渡したいデータは複数あり、***型と**型、それに変数を数個とスレッド関数に渡したいデータだらけなのですが、どのように記述すればよいでしょう? *疑問3 2つのスレッドを作成しようと考えていますが、その2つのスレッドで1つの大きな配列を共有して処理したいと考えています。 そのため、スレッド間の同期が必要になるわけですが同期の種類にもクリティカルセクションやミューテックス、イベントと豊富でどれを使用すれば良いのか迷ってしまいます。厳密に同期を取り処理をするにはイベントが一番良いと考えています。 これらの疑問に答えられる方はアドバイスをよろしくお願いします。

  • Linuxで、標準Cライブラリが読み込まれず、C言語プログラミングができません・・・

    僕の問題はタイトルの通りで、標準Cライブラリが読み込まれていないようで、C言語プログラミングができません。 ubuntuのオフィシャルから日本語ローカライズドDesktopCDをダウンロードして、空のHDDにインストールしました。 ですが、gnome-terminalからccコマンドでプログラムをコンパイルしても、標準Cライブラリにあるはずの<stdio.h>が認識されず、続くprinft関数も読んでくれません。 これはどうしてでしょうか?LinuxはデフォルトでCやらJAVAやらのプログラミングの環境が整っているものだと思っていたので、戸惑っています。何か、セットアップが必要なのでしょうか。 ちなみに、gccでも、標準ライブラリは読み込まれませんでした。

専門家に質問してみよう