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

谢谢,这是一个好主意。 –

相关问题