2017-10-11 10 views
-1

スレッドを開始するときにスレッドを作成するcプログラムがあります。スレッドの目的は、指示されたときにファームウェアをデバイスにフラッシュすることです。したがって、スレッドが起動すると、セマフォを待って、メインアプリケーションはスレッドのセマフォにsem_post(&semaphore);のポストをポストし、スレッドはそのタスクを完了します。セマフォを使用するときにcのスレッドから値を返すことができます

(ハードウェアの問題がある場合)時には、このタスクは失敗する可能性があります。私の質問は、スレッドからメインアプリケーションでセマフォがどこにポストされたかという値を返すことができますか?ファームウェアのフラッシュはsystem()で行われ、結果はint変数resに返されます。この値をメインアプリケーションに戻したいのですか?ここで

はスレッドである:ここでは

static void *flash_firmware(void *param) { 

    int res; 
    char thread_Buf[SM_BUF]; 

    printf("Started thread\r\n"); 

    while(running == 1) { 

     sem_wait(&semaphore); 

     if(running == 1) { 
      printf("*************Flashing firmware*************\r\n"); 
      snprintf(thread_Buf, SM_BUF, prog_path_printf, 
        programmingPtr->binary_filename, programmingPtr->debugger_serialnumber); 

      res = system(thread_Buf); //flash firmware 

     } 
     else 
      printf("Exiting thread \r\n"); 

    } 

    return NULL; 

} 

は、私がスレッドを作成main()の抜粋です。

#define THREADS 2 
pthread_t thread_ID [THREADS]; 

int volatile running = 1; 
sem_t semaphore; 


int main(int argc, char *argv[]) 
{ 

/initialize semaphores to be used with threads in this process, set value to 0 initially 
    sem_init(&semaphore, 0, 0); 


    //create threads for DUTs 1 & 3 
    pthread_create(&thread_ID[0], NULL, flash_firmware, &programmingPtr); 

} 

異なるソースファイルで、sem_post(&semaphore);が実行され、スレッドが処理されます。

+0

あなたが選択したIPCの任意の形式、パイプ、メールボックス、ソケット、でこれを行うことができます。 mainを待機させるか、スレッドからの結果をIPCにポーリングします。確かに他の方法もあります。 –

+1

複数のスレッドからの非同期、非読み取り、非アトミックなオブジェクトアクセスに対する未定義の動作。 – EOF

答えて

1

既存programmingPtr構造に1つの以上の要素を持ってみましょう。

pthread_exit()で希望の戻り値へのポインタを返し、後でcalling pthread_join()でキャッチすることができます。

だけポインタが静的または割り当てられたメモリの場所を参照していることを確認してください。

それはあなたのための十分な情報である場合にも、整数としてポインタを使用することができ

、例:

pthread_exit((void *)0); 

int ret; 
pthread_join(tid , (void **)&ret); 
+0

ありがとう、これは良いアイデアです。 –

+1

オブジェクトまたは文字タイプの有効なタイプではなく、左辺式を使用してオブジェクトにアクセスするための未定義の動作。 – EOF

1

私はスレッドに渡されたprogrammingPtr構造体引数についてはよく分からないけど、flash_firmwareスレッドであなたの条件に基づいてその構造や更新に1つの以上result変数を追加します。スレッドからの戻り時に、以下のような主な機能にresultの値を守ってください。

さんがはいすることができます

struct programmingPtr{ 
    int result; 
}; 
+0

ありがとうございました。 –

関連する問題