当使用信号量时,你能 return 来自 c 线程的值吗
can you return a value from a thread in c when using semaphores
我有一个 c 程序,它在启动时创建一个线程。线程的目的是在收到指示时将固件闪存到设备。因此,当线程启动时,它会等待信号量,并且在某个时候主应用程序将 sem_post(&semaphore);
post 到线程中的信号量,线程将完成其任务。
有时此任务可能会失败(如果存在硬件问题)。我的问题是我可以 return 从线程到信号量在主应用程序中 posted 的位置的值吗?固件的闪烁是通过 system()
完成的,结果是 returned 到 int 变量 res
。我想return这个值到主应用程序?
这是主题:
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);
将被执行,线程将继续。
我不确定传递给 Thread 的 programmingPtr
结构参数,但是通过向该结构添加一个 result
变量并在 flash_firmware
线程中根据你的条件。在线程的 return 上,观察主函数中 result
的值,如下所示:
让我们在现有的 programmingPtr
结构中增加一个元素
struct programmingPtr{
int result;
};
是的,你可以。
您可以 return 使用 pthread_exit(), and than catch it later with calling pthread_join() 指向您想要的 return 值的指针。
只需确保指针引用的是静态或已分配的内存位置。
如果对您来说信息足够的话,您也可以将指针用作整数,例如:
pthread_exit((void *)0);
int ret;
pthread_join(tid , (void **)&ret);
我有一个 c 程序,它在启动时创建一个线程。线程的目的是在收到指示时将固件闪存到设备。因此,当线程启动时,它会等待信号量,并且在某个时候主应用程序将 sem_post(&semaphore);
post 到线程中的信号量,线程将完成其任务。
有时此任务可能会失败(如果存在硬件问题)。我的问题是我可以 return 从线程到信号量在主应用程序中 posted 的位置的值吗?固件的闪烁是通过 system()
完成的,结果是 returned 到 int 变量 res
。我想return这个值到主应用程序?
这是主题:
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);
将被执行,线程将继续。
我不确定传递给 Thread 的 programmingPtr
结构参数,但是通过向该结构添加一个 result
变量并在 flash_firmware
线程中根据你的条件。在线程的 return 上,观察主函数中 result
的值,如下所示:
让我们在现有的 programmingPtr
结构中增加一个元素
struct programmingPtr{
int result;
};
是的,你可以。
您可以 return 使用 pthread_exit(), and than catch it later with calling pthread_join() 指向您想要的 return 值的指针。
只需确保指针引用的是静态或已分配的内存位置。
如果对您来说信息足够的话,您也可以将指针用作整数,例如:
pthread_exit((void *)0);
int ret;
pthread_join(tid , (void **)&ret);