【问题标题】:how to create a struct and pass to a new thread via pthread_create()如何创建结构并通过 pthread_create() 传递给新线程
【发布时间】:2015-12-10 20:18:11
【问题描述】:

我有一个回调函数正在我需要的地方写:

1 创建一个结构
2 创建一个新线程并将此结构传递给线程以供其独占使用
3 从回调函数中返回一个指向这个结构体的指针……到主程序。

这将允许原始程序和新线程之间通过共享内存进行通信。

我假设我必须使用 malloc,因为在回调函数中创建的结构的范围仅在函数中。

我无法将其设为静态,因为我将创建多个线程,每个线程都有自己的个人结构。

我是新手,需要了解流程。

这样可以吗?

1 malloc 一块内存“sizeof”结构。
2 将指向该块的指针传递给新线程并将其返回给主程序。
3 一次在新线程中使用此内存创建一个新结构?

我现在已经搜索了一周,看不出应该怎么做。

顺便说一句:我无法修改设计为单线程的主程序。 我只能使这个回调函数产生许多新线程之一,并通过我想成为一个结构的这个共享内存进行通信。

谢谢。

struct myStruct
{
    int elem1;
    int elem2;
    int elem3;
};



int* callBack(some parameters)
{
    *p = malloc(sizeof(myStruct));

    result = pthead_create( ??, ??, void *(*newThread), *p);

    return p;
}


void newThread()
{
    // pull off *p from stack?

    // somehow use the declared struct to access the malloc mem

    p->elem1 = p->elem2 + p->elem3;
}

【问题讨论】:

  • 我很困惑。你想要堆(分配)内存还是想要共享内存(如果你需要共享内存,为什么?)
  • 我想要任何有用的东西。我所看到的都是 malloc 示例,所以我认为这就是我想要的?

标签: c multithreading pthreads


【解决方案1】:

通过pthread_create() 创建的线程以void* 作为参数,因此您的线程例程的原型应如下所示:

void newThread(void* data)

这个void* 然后对应于作为最后一个参数传递给pthread_create 的指针。然后,您可以将此指针转换为适当的数据类型(但请确保您获得正确的数据类型!)。一个例子如下:

void newThread(void* data)
{
    struct myStruct* p = data;
    p->elem1 = p->elem2 + p->elem3;
}

【讨论】:

  • 感谢您的帮助!我不确定我是否理解这一行:struct myStruct* p = data;
  • 这会将 void 指针转换为正确类型的指针。 pthreads 不知道您要传递什么数据类型,因此使用 void 指针来指定缺少任何类型信息。因此,要使用它,您必须再次将其转换回正确的类型。
  • 所以 'p' 是一个局部变量,也是一个指针,指向一个特别是 myStruct 的类型?
  • 是的。指针本身存储了被指向对象的地址,所以有两个不同的指针都指向同一个数据。
  • 我还有一个问题……线程看到的内存不是外部进程看到的内存。我传递 arg 指针的方式一定有问题吗?如果我理解正确 pthread_create() 想要一个指向 arg 的指针并将这个指针传递给线程?
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
相关资源
最近更新 更多