2

我使用以下代码创建了两个线程:

//header files
#include <pthread.h>
struct thread_arg
{
    int var1;
    int var2;
};
void *serv_com(void *pass_arg)
{
    struct thread_arg *con = pass_arg;
    //required statements irrelevant to the issue
    pthread_exit(NULL);
}
void *cli_com(void *pass_arg)
{
    struct thread_arg *con = pass_arg;
    //required statements irrelevant to the issue
    pthread_exit(NULL);
}
int main()
{
    pthread_t inter_com;
    //necessary code
    while(1)
    {
        th_err_s = pthread_create(&inter_com, NULL, serv_com, (void *)&pass_arg);
        th_err_c = pthread_create(&inter_com, NULL, cli_com, (void *)&pass_arg);
        if (th_err_s || th_err_c)
        {
            printf("Alert! Error creating thread! Exiting Now!");
            exit(-1);
        }
    }
    pthread_exit(NULL);
    return 1;
}

然后我使用以下命令在linux中编译了上面的代码:

gcc -o sample sample.c

它返回以下错误消息:

inter.c:(.text+0x374): undefined reference to `pthread_create'
inter.c:(.text+0x398): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

我应该怎么做才能正确编译这个文件。我确信它没有语法错误或任何东西,因为当我注释掉 while 循环内的所有内容时,程序正在正确编译并且我验证了 pthread_create 语法是正确的。我是否必须发出其他命令来编译文件?

编辑:在上面的代码中创建两个线程有​​什么问题吗?程序一旦运行就会退出并显示错误消息。可能是什么问题,我该如何解决?提前致谢。

4

3 回答 3

4

尝试这样做:

gcc -lpthread sample.c

或者

gcc -pthread sample.c

以上2个命令将直接创建可执行的a.out

编辑后回答:

1)等待两个线程使用调用加入主线程

int pthread_join(pthread_t thread, void **value_ptr);

2)创建具有不同ID的两个线程

3) 如果可以的话,也要避免从 main() 调用 pthread_exit,尽管这样做并没有什么坏处

4)您在while(1)中调用pthread_create,这将创建无限线程..我不知道您要实现什么。

于 2012-05-18T11:15:03.853 回答
2

编译时链接到 pthread 库...

gcc -o 样本 -lpthread 样本.c

于 2012-05-18T10:53:49.220 回答
0

我自己也不太确定,但我认为你可以做类似的事情

pthread_t inter_com, inter_com2;

th_err_s = pthread_create(&inter_com, NULL, serv_com, (void *)&pass_arg);
        th_err_c = pthread_create(&inter_com2, NULL, cli_com, (void *)&pass_arg);

我认为它应该为您提供 2 个线程 ID。但是在线程之间共享变量等时要小心。但很高兴你自己解决了。

于 2015-08-14T18:43:17.317 回答