【发布时间】:2017-10-11 10:42:10
【问题描述】:
我有一个在启动时创建线程的 c 程序。该线程的目的是在收到指令时将固件闪存到设备中。因此,当线程启动时,它会等待一个信号量,并且在某个时刻,主应用程序将sem_post(&semaphore); 发布到线程中的信号量,线程将完成其任务。
有时此任务可能会失败(如果存在硬件问题)。我的问题是我可以从线程返回一个值到信号量在主应用程序中发布到的位置吗?固件的刷新是通过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() 的 sn-p。
#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); 将被执行,线程将继续。
【问题讨论】:
-
您可以使用任何形式的 IPC、管道、邮箱、套接字来执行此操作,您可以选择。让 main 等待或轮询 IPC 以获取线程的结果。当然还有其他方法。
-
从多个线程对对象进行非同步、非只读、非原子访问的未定义行为。