質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.23%

C言語 スレッドについて

解決済

回答 1

投稿 ・編集

  • 評価
  • クリップ 3
  • VIEW 3,436

deluhi0905

score 29

ご質問いたします。

C言語でスレッドを使用して入力した文字列を10秒毎にそのまま表示か、逆から表示かを切り替えるプログラムを下記条件の元、作成したいのですがスレッドの使い方が解りません。

・表示を行う関数は、あらかじめ関数ポインタとして表示命令のスレッドに渡し、関数ポインタを使い分けることによって表示を切り替えること。
・入力する文字は可変
・10秒毎の表示命令は、別スレッドにて行う

特に「関数ポインタを使い分けて表示を切り替える」という所がわかりません。
OSはLINUX、コンパイラはgccを使用しております。

どなたかご回答を宜しくお願い致します。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

スレッドの生成には、pthread_createを使います。
関数ポインタはvoid (*f)()のように宣言します。これは、引数も戻り値も無い関数を指すポインターになります。変数名はfです。
無限ループで、この関数ポインターに、print_charsprint_reversed_charsを交互にセットします。
メインスレッドが終了すると、プロセスが終了します。

pthread_createの第4引数には、スレッド関数に渡す引数をポインターとして指定しますが、これには1つしか指定できないので注意が必要です。


以下のコードは、スレッドと関数ポインターを使った例です。
2秒ごとに、print_charsprint_reversed_charsを出力します。ENTERで終了します。

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void *show(void *arg);
void print_chars();
void print_reversed_chars();

void *show(void *arg)
{
  void (*f)();
  int  i;

  for (i = 1; ;i *= -1)
  {
    f = (i == 1) ? print_chars : print_reversed_chars;
    f();
    sleep(2);
  }
}

void print_chars()
{
  printf("print_chars\n");
}

void print_reversed_chars()
{
  printf("print_reversed_chars\n");
}

int main()
{
  pthread_t th;

  if (pthread_create(&th, NULL, show, (void *)NULL) != 0)
  {
    printf("スレッドの生成に失敗\n");
  }

  // 何か入力するまで待機
  getchar();

  return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/29 20:29

    argius さん

    ご回答いただきありがとうございます。
    スレッドの生成や引数について教えていただきありがとうございます。

    お聞きしたいのですが、
    pthread_createの第4引数で関数ポインターの一つしか渡す事が出来ないとの事で
    入力した文字列・それを逆にした文字列を交互に表示させるということはできないでしょうか?

    キャンセル

  • 2014/10/29 20:43

    元の文字列を渡した後で逆にするのではダメですか?
    複数の値を渡すには、配列のポインターか構造体のポインターを利用します。

    キャンセル

  • 2014/10/30 20:44

    argius さん

    試しにpthread_createの第4引数に
    (void *)入力した文字列、void *show(char *入力した文字列)
    に、してみた所、正常に動作いたしました。

    また、
    ----------------------------------------------------------
    >void (*f)();

    for (i = 1; ;i *= -1)
    {
    > f = (i == 1) ? print_chars : print_reversed_chars;
    > f();
    ----------------------------------------------------------
    上記文の「>」の個所についての発想が無く、大変理解できました。
    拙い質問のご対応頂きましてありがとうございました。

    キャンセル

  • 2014/10/30 20:49

    丁寧な解決レポートありがとうございます。
    参考にしていただけたようで良かったです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

関連ワード: c言語 スレッド