マルチスレッドのやり方

このQ&Aのポイント
  • マルチスレッドのやり方について
  • MacでのC言語でのマルチスレッドの方法についての質問です。
  • CreateThread関数を使おうとしているがエラーが出るため、他の方法を知りたい。
回答を見る
  • ベストアンサー

マルチスレッドのやり方

MacでC言語の勉強をしています。 WindowsでBASICのプログラム経験が多少あり、 C言語のサイトも参考にしていたので、Macでも同じように出来るかな? と思っていると、出来ませんでした。 CreateThread関数を使おうとしていたのですが、Cではwindows.hのようなファイルを参考にしたサイトではインクルードさせていたのでコピーペーストし、 createthreadとしたのですが、(おそらく)「windows.hのようなファイルはない」のようなエラーが出ます。 Macではマルチスレッドは使用できないのでしょうか。 それともほかのやり方があるのでしょうか。 すいませんがご教示いただけると幸いです。 よろしくお願いします。

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

  • ベストアンサー
回答No.4

undeclaredというエラーは、コンパイル時にある関数を呼び出す処理を解釈するときにその関数がその時点でどこにも宣言されていないことを示します。無論定義(実装)もありません。 なので単純にC言語のルールが守られていないというエラーです。スレッド関係のエラーではないようです。 main関数の前に void paint( void ); と宣言するだけでなおるはずです。

その他の回答 (3)

回答No.3

どうしてもC言語とういことであればC言語で使えるライブラリやpthreadを使わないとMacではだめでしょうね。 もしC言語のみということにこだわる必要がないのであればC++とboostを使用されることをお勧めいたします。 boost::threadはポータブルに使えてソースが環境依存しにくくなるので便利です。 MacでもWindowsでもご自身で書かれたプログラムが根本的な処理は同じようにかけるということです。無論環境ごとにboostライブラリをビルドしてやる必要があり、環境ごとにそのライブラリを使ってください。

mogeraccho
質問者

お礼

ご回答ありがとうございます。 学校の課題なので、C言語でないとだめなのです。 ただ、最初に書かせていただいたとおり、BASICの経験があり少しくらいはプログラミング経験があるので、やってみようかと思い質問させていただいています。 No.1の方の回答を参考に調べ、 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> //グローバル変数 int point; //得点 int life; //ライフ main(){ int flag; int ly; //描画関数のスレッド pthread_t thread; pthread_create(&thread,NULL,paint,NULL); pthread_join(thread,0); getchar(); return 0; } //画面描写するルーチン(無限ループマルチスレッド用) paint(){ for (;;){  何らかの処理~ //スレッドの一時休止 usleep(160); } } こんな感じで書いたのですが、 error: 'paint' undeclared (first use in this function) と表示されます。 どのように修正したらいいのでしょうか。

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

ここらへんが参考になるでしょう。 Threading Programming Guide http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ C言語でそこまで高レベルのことをやるなら、Cocoa(Objective-C)を系統的に勉強したほうがいいと思いますが?

mogeraccho
質問者

お礼

ご回答ありがとうございます。 申し訳ないですが、私には読解できませんでした。 そしてマルチスレッドが高レベルだということは知りませんでした。 No.1の方の回答を参考に調べ、 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> //グローバル変数 int point; //得点 int life; //ライフ main(){ int flag; int ly; //描画関数のスレッド pthread_t thread; pthread_create(&thread,NULL,paint,NULL); pthread_join(thread,0); getchar(); return 0; } //画面描写するルーチン(無限ループマルチスレッド用) paint(){ for (;;){  何らかの処理~ //スレッドの一時休止 usleep(160); } } こんな感じで書いたのですが、 error: 'paint' undeclared (first use in this function) と表示されます。 どのように修正したらいいのでしょうか。

回答No.1

Macでも当然マルチスレッド実装は出来ます。 ただしCreateThreadはWIndowsが提供しているAPIですからMACでは使えません。 MACでのプログラミング経験がないのでわかりませんが、 POSIXスレッドが使えたはずです。 pthread_createで検索してみてください。 使用例がわんさかヒットするはずです。

mogeraccho
質問者

お礼

ご回答ありがとうございます。 pthread_createで調べ、自分でいろいろやっているのですが pthread_create関数の第三引数でエラーが出てしまいます。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> //グローバル変数 int point; //得点 int life; //ライフ main(){ int flag; int ly; //描画関数のスレッド pthread_t thread; pthread_create(&thread,NULL,paint,NULL); pthread_join(thread,0); getchar(); return 0; } //画面描写するルーチン(無限ループマルチスレッド用) paint(){ for (;;){  何らかの処理~ //スレッドの一時休止 usleep(160); } } こんな感じで書いたのですが、 error: 'paint' undeclared (first use in this function) と表示されます。 どのように修正したらいいのでしょうか。

関連するQ&A

  • (マルチスレッド)_beginthreadexに複数の引数を渡す

    現在プログラムでマルチスレッドをやろうとしているのですが、 マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか? MSDNで調べてみると、_beginthreadex関数の4番目のNULLのところに引数リストを 指定できるとあったのですが、その意味が良くわかりませんでした。 以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合は どのように書けばいいのでしょうか? #include <stdio.h> #include <windows.h> #include <process.h> unsigned WINAPI MyThread( void *lpx ){ while (1) { printf("スレッド実行中\n"); Sleep(1000); } return 0; } void main(){ // スレッドに渡したい変数の宣言 int a = 128; int b = 256; int c = 512; // スレッドIDの宣言 DWORD thID; // マルチスレッドの開始 (HANDLE)_beginthreadex( NULL, 0, &MyThread, NULL, 0, (unsigned int*)&thID ); // ループ while (1) { printf("メイン関数実行中\n"); Sleep(2000); } }

  • マルチスレッドプログラミングについて

    C言語のマルチスレッドについて学びたいと思っています。 「猫でも分かる」のマルチスレッドの項を見てみましたが、 もうちょっと色々コードのサンプルを見てみたいと思いました。 そこで他にマルチスレッドを解説しているサイトを探そうと検索してみても、 書籍情報ばかりが出てきて、なかなか解説サイトを探せませんでした。 マルチスレッドの簡潔なサンプルが載っているようなサイトがあれば教えていただけたらと思います。

  • C言語で画面に図形や絵を描画するインクルードファイ

    C言語で画面に図形や絵を描画するインクルードファイル?って、標準でありますか? C、どどどどどどドッ素人です。 昨日、やっとHello Wordができた程度です。 これから、C言語を覚えようと思うのですが、描画関数が見つかりません。 C言語は描画関数はデフォルトで入っていないのでしょうか?(windowsやmac、Linuxなどでも) stdio.hは、どのOSにも基本入ってます。 描画関数はstdio.hのように、ありますか?

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

    環境は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ランタイムライブラリ

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

  • マルチスレッド

    ウインドウズプログラミングを始めて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)マルチスレッドはこういう時に使うとよい、 というような大まかな判断基準があれば教えて下さい。 分かり辛い質問で申し訳有りません。宜しくお願い致します。

  • マルチスレッド化。

    今とても大きな配列を使用し、長時間処理をするプログラムを組んでいます。元々処理時間に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つの大きな配列を共有して処理したいと考えています。 そのため、スレッド間の同期が必要になるわけですが同期の種類にもクリティカルセクションやミューテックス、イベントと豊富でどれを使用すれば良いのか迷ってしまいます。厳密に同期を取り処理をするにはイベントが一番良いと考えています。 これらの疑問に答えられる方はアドバイスをよろしくお願いします。

  • MacでC言語を使いアプリケーションを作っています。

    前の質問でおかしな質問をしてしまったのでここで改めて質問します。 今、MacでWindowsのアプリケーションをつくろうとしています。しかし、Windows固有の関数をMacではどのように記述すればよいかが分からないので全然進みません。MacでC言語を解説しているページは少なく、Windows関数はMacでどうするのかといった解説はもちろんありません。Macにしようとしているアプリケーションはパワポケのパスメってやつで、プログラムの言語はC++言語です。 http://f1.aaa.livedoor.jp/~pasume/pass/pasume.htm 上のサイトの『PM_GB1 Ver1.0』というアプリケーションです

  • C/C++のヘッダーファイルやライブラリー関数について

    C言語の勉強をはじめました。コードの最初に書く#include<stdio.h>などの ヘッダーファイルやライブラリ関数を見ることはできるのでしょうか? 初歩的なことですみませんがよろしくお願い致します。

  • iostream stdio 違いについて。

    一昔前のC言語では、#include <stdio.h>などのものを、C ++言語では、#include <iostream>の1行で済ませるということでしょうか? だけど、C + +言語で、#include<stdio.h>を使いたければ使うことは出来ますよ。だけど、#include<iostream>だけで、済みますよ。という事でしょうか?つまり、#include<iostream>は、全ストリームつまり、全ファイル・全ライブラリを1つにまとめたという事でしょうか?教えて頂けると幸いです。

専門家に質問してみよう