【问题标题】:Passing more than one parameter to pthread_create [duplicate]将多个参数传递给 pthread_create [重复]
【发布时间】:2012-01-23 18:07:31
【问题描述】:

可能重复:
Multiple arguments to function called by pthread_create()?
How to pass more than one value as an argument to a thread in C?

我有这些结构:

struct Request {
    char buf[MAXLENREQ];
    char inf[MAXLENREQ]; /* buffer per richiesta INF */
    int lenreq;
    uint16_t port; /* porta server */
    struct in_addr serveraddr; /* ip server sockaddr_in */
    char path[MAXLENPATH];
    /*struct Range range;*/
};

struct RequestGet {
    char buf[MAXLENREQ];
    int maxconnect;
    struct Range range;
};

struct ResponseGet{
    char buf[MAXLENDATA];
    //int LenRange;
    int expire;
    char dati[MAXLENDATA];
    struct Range range; 
};

如何将它们传递给pthread_create?不管结构的每个字段的含义。

pthread_create(&id,NULL,thread_func,????HERE????);

【问题讨论】:

标签: c multithreading parameters pthreads


【解决方案1】:

您只能传递一个参数,因此您通常需要制作一个接受一个参数的函数,即使它只是包装了一些其他调用。您可以通过创建struct 并让函数获取指向此类struct 的指针来做到这一点。

说明这一点的基本示例如下。请注意,它不是一个完整的例子,应该按原样使用!例如,请注意,使用malloc() 分配的内存都没有被释放。

struct RequestWrapper {
    struct Request *request;
    struct RequestGet *request_get;
    struct ResponseGet *response_get;
};

void thread_func(struct RequestWrapper *rw) {
    // function body here
}

int main(int argc, char *argv[]) {
    struct Request *request = malloc(sizeof(*request));
    struct RequestGet *request_get = malloc(sizeof(*request_get));
    struct ResponseGet *response_get = malloc(sizeof(*response_get));
    ...

    struct RequestWrapper *wrapper = malloc(sizeof(*wrapper));

    wrapper->request = request;
    wrapper->request_get = request_get;
    wrapper->response_get = response_get;

    ...

    pthread_create(&id, NULL, thread_func, &wrapper);
    ...
}

【讨论】:

  • 危险的不完整。请参阅我对 spraff 的评论。
  • @R.. 这个想法是让他从他不理解的概念开始,而不是编写一大堆其他代码。无可否认,最好的例子是那些按原样运行的例子,但这让人们了解如何传递多个东西,我认为它恰当地传达了这一点。不过,我会在其中添加一个注释,指出它的不完整。
  • 嗯,问题是你“让他开始”的代码可能会在 99% 的时间内工作,而在另外 1% 的时间里会崩溃或严重损坏内存。初学者不太可能意识到这一点,更不用说知道如何回去修复它了..
  • 特别是,您可以简单地编辑您的示例以使用 malloc 而不是结构的本地 var,示例将保持同样简单,但不再危险。跨度>
  • @R.. 很公平。反映在上面。
【解决方案2】:
struct Foo {
   // anything you want
};

void run (void * _arg) {
    Foo * arg = (Foo*) _arg;
    // ...
}

int main () {
    pthread_t thread;
    Foo * foo = create_argument ();

    pthread_create (&thread, NULL, run, foo);
}

当然,这取决于runpthread_create 的最后一个参数中总是被赋予Foo* 的合约。

【讨论】:

  • 这个答案很不完整;如所写,foo 的生命周期可能在run 能够使用它之前结束。您必须为foomalloc 分配空间(和free 它在新线程中,而不是父线程!)或使用一些同步对象(屏障或信号量最简单)以确保foo'人的一生不会很快结束。
【解决方案3】:

pthread_create() 的最后一个参数是一个空指针。它的名称是你可以让它指向任何类型的变量、结构等。你的thread_func 知道如何处理它,并且可以将它转换回原来的类型。

【讨论】:

    【解决方案4】:

    将他们的地址放入struct,并将指向struct的指针作为pthread_create()的最后一个参数传递。

    【讨论】:

      【解决方案5】:

      您可以为所有数据创建一个结构并传递结构的地址。您可能需要将结构放入堆中并在完成后释放它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-20
        • 2023-03-31
        • 1970-01-01
        • 2016-10-25
        • 2022-01-01
        • 2012-12-12
        • 1970-01-01
        • 2017-05-05
        相关资源
        最近更新 更多