0

スレッドから整数値を返すのに助けが必要です。私はいくつかのことを試しましたが、それを機能させることができません。私はCが初めてで、はい、これは宿題ですが、行き詰まっており、これについて助けが必要です. スレッドでポインターを作成しましたが、それをメインに戻すと、正しい値が表示されません。私はmallocを試しましたが、それもうまくいきません。ヒントをいただければ幸いです。

コードは次のとおりです。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<pthread.h>
#include "FindNextHigher.h"
#include "SortNumber.h"

void *thread_next(void *arg)
{
   /* Call FindNextHigher */
   int *num =(int *)arg;
   int next = FindNextHigher(*num);
   printf("next= %d\n", next);
   /* Convert int to pointer to pass and print to check*/
   int *next_ptr=&next;
   printf("nextptr= %d\n", *next_ptr);
   return (void *)next_ptr;
}

int main(int argc, char *argv[])
{
   FILE* f = fopen(argv[1], "r");
   int i, num, *next_ptr;
   printf("next_ptr = %d\n", *next_ptr);
   pthread_t thread1, thread2, thread3, thread4;
   void *exit_status;

   for(i=1; i<=20; i++)
   {
   fscanf(f, "%d", &num);
   if (i==1 || i<=60){
     pthread_create(&thread1, NULL, thread_next, &num);
     pthread_join(thread1, &exit_status);
     printf("Threadid 1 processes number %d which is %d and the next higher number is %d\n", i, num, *next_ptr);
     if (i==60){
        printf("--------------Process finished for Thread 1----------");
        } 
     }
   else {
   if (i==61 || i<=120){ 
     pthread_create(&thread2, NULL, thread_next, &num);
     pthread_join(thread2, &exit_status);
     printf("Threadid 2 processes number %d which is %d and the next higher number is %d\n", i, num, *next_ptr);
     if (i==120){
        printf("--------------Process finished for Thread 2----------");
     }
   }
   else{
   if (i==121 || i<=180){
     pthread_create(&thread3, NULL, thread_next, &num);
     pthread_join(thread3, &exit_status);
     printf("Threadid 3 processes number %d which is %d and the next higher number is %d\n", i, num, *next_ptr);
     if (i==180){
        printf("--------------Process finished for Thread 3----------");
      }
   }
   else{
   if (i==181 || i<=240){
     pthread_create(&thread4, NULL, thread_next, &num);
     pthread_join(thread4, &exit_status);
     printf("Threadid 4 processes number %d which is %d and the next higher number is %d\n", i, num, *next_ptr);
     if (i==240){
        printf("--------------Process finished for Thread 4----------");
     }
   }
   }
   }
   }
   }    
   return 0;
}
4

3 に答える 3

1

nextコードのように、スレッド関数に対してローカルな変数へのポインターを返さないでください。その理由は他の関数の場合とほとんど同じです。関数が終了すると(スレッドが終了すると)変数の有効期間が終了するため、変数へのポインターは信頼できません。代わりに、次のいずれかを試してください。

開始時に変数frommainを使用し、そのアドレスをスレッド関数に渡してから、スレッドから変更します(ただし、ミューテックスを使用しない限り、スレッドの実行中にスレッドの外部から触れないでください)。

intまたは、スレッドに動的に割り当てて、そのポインタへのポインタを返します。使い終わったら、メインスレッドから解放します。

または、表現に互換性があることが確実な場合は、をキャストしintてポインタ型に返し、それを返しint、メインスレッドにキャストして戻すことができます。これは一般的なアプローチですが、システムで機能することを確認する必要があります(通常、ポインターがintsと同じ大きさの場合は機能しますが、当然のこととは言えません)。

于 2013-03-19T16:47:47.213 に答える
1

いくつかのバグがあります。まず、next_ptr印刷する前に初期化しません。

次に、変数へのアクセスを保護するための同期メカニズムを使用せずに、変数の同じインスタンスへのポインターを 4 つのスレッド間で共有します。クリティカル セクションまたはミューテックス/セマフォを使用する必要があります。

于 2013-03-19T16:32:51.447 に答える
1

まず、気をつけていただきたいことがあります。

int i, num, *next_ptr;
...

for(i=1; i<=20; i++)
{
  fscanf(f, "%d", &num);
  ...
  pthread_create(&thread1, NULL, thread_next, &num);

&num各スレッドの番号を個別に読み取りながら、すべてのスレッドに同じアドレス ( ) を送信しています。それらのすべてが同じ番号へのポインタを持っているため、ほとんどの場合、それらはすべて最後の値 (または任意に割り当てられた値またはそれ以降の値) を取ることになります。したがって、引数として、numスレッドと同じ数の s が必要になります。

整数を返すには、整数キャストを a に返すことができますがvoid *、これは機能しますが、完全に標準ではありません。1 つの解決策は、引数によって戻り値の場所を提供することです。

struct arg_and_return
{
    int num;
    int ret;
};

struct arg_and_return ar;
fscanf(f, "%d", &ar.num);
pthread_create(&thread, NULL, thread_func, &ar);

そして、スレッド内に を記入して((struct arg_and_return *)arg)->retください。もちろん、arスレッドと同じ数の s が必要です。

于 2013-03-19T16:36:07.373 に答える