首页 文章

你可以在使用信号量时从c中的线程返回一个值

提问于
浏览
-1

我有一个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); 将被执行,线程将继续 .

2 回答

  • 1

    是的你可以 .

    您可以使用pthread_exit()返回指向所需返回值的指针,然后使用calling pthread_join()将其捕获 .

    请确保指针引用静态或已分配的内存位置 .

    如果有足够的信息,您也可以将指针用作整数,例如:

    pthread_exit((void *)0);
    
    int ret;
    pthread_join(tid , (void **)&ret);
    
  • 1

    我不确定传递给Thread的 programmingPtr 结构参数,但是通过向该结构添加一个 result 变量并根据您的条件在 flash_firmware 线程中更新该变量 . 从线程返回时,在主函数中观察 result 的值,如下所示:

    让我们现有的 programmingPtr 结构中还有一个元素

    struct programmingPtr{
        int result;
    };
    

相关问题