gpt4 book ai didi

使用函数指针从线程调用回调

转载 作者:太空狗 更新时间:2023-10-29 14:58:30 28 4
gpt4 key购买 nike

c程序编译器gcc

我有 3 个文件。 main.c stop_watch.h 和 stop_watch.c

这个程序确实有效。我调用 start_stopwatch。超时后会在main.c timeout_cb()中回调。我也在一个单独的线程中运行它,因为我不想在 main 中阻塞,因为我还有其他需要运行的代码。

1) g_start_timer 中的秒数总是乱码。我想我可能已经通过在堆上创建结构来解决这个问题。无论如何我可以解决这个问题。我正在考虑在堆上创建秒元素。但认为这已经结束了

2) 这个程序工作正常,但是如果我注释掉主 printf("=== timeout_cb: %p\n", timeout_cb) 中的行;它将堆栈转储。

3) 什么时候是释放内存的最佳时机。我在主要释放它。但是我担心在线程完成之前是否释放了内存。这可能会导致非常意外的结果。我想我可以在这次调用后使用 thread_join() 来释放内存。但是,我需要返回在 stop_watch.c 中创建的 thead_id,有没有办法返回在 stop_watch.c 中创建的 thread_id

非常感谢您的任何建议,

ma​​in.c

/* main.c */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#include "stop_watch.h"

/* call this when the time expires */
void timeout_cb()
{
printf("=== your time is up run some job here ===\n");
}

int main()
{
struct data_struct *g_data_struct =
(struct data_struct*) calloc(1, sizeof(*g_data_struct));

if(!g_data_struct)
{
printf("=== failed to allocate memory ===\n");
return 0;
}

g_data_struct->seconds = 3;
g_data_struct->func_ptr = timeout_cb;

// printf("=== timeout_cb: %p\n", timeout_cb);

start_stopwatch(g_data_struct);

// free(g_data_struct);
printf("=== End of Program - all threads in ===\n");

pthread_exit(NULL);

return 0;
}

stop_watch.h

/* stop_watch.h */
struct data_struct
{
int seconds;
void (*func_ptr)(void);
};
void start_stopwatch(struct data_struct *g_data_struct);

stop_watch.c

#include <stdio.h>
#include <pthread.h>

#include "stop_watch.h"

static void* g_start_timer(void *args)
{
void (*function_pointer)();

int seconds = ((struct data_struct*) args)->seconds;
function_pointer = ((struct data_struct*) args)->func_ptr;

printf("=== go to sleep for %d\n", seconds);

sleep(seconds);

(void) (*function_pointer)();

pthread_exit(NULL);

return 0;
}

void start_stopwatch(struct data_struct *g_data_struct)
{
pthread_t thread_id;
int rc;

int seconds = g_data_struct->seconds;
printf("=== start_stopwatch(): %d\n", seconds);

rc = pthread_create(&thread_id, NULL, g_start_timer, (void *) &g_data_struct);

if(rc)
printf("=== Failed to create thread\n");
}

最佳答案

start_stopwatch() 中的行:

rc =  pthread_create(&thread_id, NULL, g_start_timer, (void *) &g_data_struct);

应该是:

rc =  pthread_create(&thread_id, NULL, g_start_timer, (void *) g_data_struct);

在第一种情况下,当您真的只想将指针作为线程参数传递时,您传递的是“指向指针的指针”。

至于何时释放数据,有很多选择。如果您总是在堆分配 block 中传递线程数据,那么g_start_timer() 线程过程可以在完成提取数据时释放它。请注意,如果您这样做,则启动线程的部分协议(protocol)是线程参数 block 必须是堆分配的。

关于使用函数指针从线程调用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/587393/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com