【问题标题】:can you return a value from a thread in c when using semaphores使用信号量时,您可以从 c 中的线程返回值吗
【发布时间】: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 以获取线程的结果。当然还有其他方法。
  • 从多个线程对对象进行非同步、非只读、非原子访问的未定义行为。

标签: c pthreads semaphore


【解决方案1】:

是的,你可以。

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

只要确保指针引用的是静态或分配的内存位置即可。

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

pthread_exit((void *)0);

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

【讨论】:

  • 未定义的行为,用于通过不是对象的有效类型或字符类型的左值表达式访问对象。
【解决方案2】:

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

让我们在现有的programmingPtr 结构中再添加一个元素

struct programmingPtr{
    int result;
};

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 2013-05-27
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多