2017-10-11 94 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

當然可以。

你可以用pthread_exit()返回一個指向你想要的返回值的指針,然後用calling pthread_join()來捕獲它。

只要確保指針正在引用靜態或分配的內存位置。

您也可以使用指針作爲一個整數,如果它是足夠的信息給你,例如:

pthread_exit((void *)0); 

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

謝謝,這是個好主意。 –

+1

通過左值表達式訪問對象的未定義行爲,不是對象的有效類型或字符類型。 – EOF

1

我不知道有傳遞給線程programmingPtr結構參數,但通過添加一個更result變量是結構和更新,在flash_firmware螺紋基礎上,你的條件。從螺紋的回報,觀察result價值的主要功能如下圖所示:

,讓我們多了一個元素在您現有的programmingPtr結構

struct programmingPtr{ 
    int result; 
}; 
+0

謝謝,這是一個好主意。 –

相關問題