gpt4 book ai didi

C pthread互斥: Expected expression before `{'

转载 作者:太空狗 更新时间:2023-10-29 16:46:36 34 4
gpt4 key购买 nike

我正在使用 pthread 库创建两个线程。我正在使用两个队列在两个线程(生产者-消费者)之间传递数据,因此希望有一个互斥锁来同步线程队列中的 push-pops。

但是我得到如下编译错误:

$ gcc simple-tun.c simple-tun -lpthread
simple-tun.c: In function ‘new_queue’:
simple-tun.c:920:13: error: expected expression before ‘{’ token

我得到错误的函数是:

908 struct queue * new_queue () {
909
910 struct queue * q;
911 q = (struct queue *) malloc (sizeof(struct queue));
912
913 if (q == NULL)
914 return NULL;
915
916
917 q->head = NULL;
918 q->tail = NULL;
919 q->is_empty = 1;
920 q->mutex = PTHREAD_MUTEX_INITIALIZER;
921
922 return q;
923 }

结构队列是:

    struct queue {
80 struct node * head;
81 struct node * tail;
82 int is_empty;
83 pthread_mutex_t mutex;
84 };

如果我注释掉第 920 行,链接器开始给出“多个声明错误”

$ gcc simple-tun.c simple-tun -lpthread
simple-tun: In function `settun':
(.text+0x2b7): multiple definition of `settun'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1cb): first defined here
simple-tun: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
simple-tun: In function `mktun':
(.text+0x1e2): multiple definition of `mktun'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0xf6): first defined here
simple-tun: In function `net_connect':
(.text+0xe27): multiple definition of `net_connect'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1115): first defined here
simple-tun: In function `data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here
simple-tun: In function `client_connect':
(.text+0xe95): multiple definition of `client_connect'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1183): first defined here
simple-tun: In function `data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o:(.data+0x0): first defined here
simple-tun:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o:(.rodata.cst4+0x0): first defined here
simple-tun: In function `server_connect':
(.text+0xfa2): multiple definition of `server_connect'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x1290): first defined here
simple-tun: In function `print_usage':
(.text+0xe05): multiple definition of `print_usage'
/tmp/cc5Ms4xP.o:simple-tun.c:(.text+0x10f3): first defined here
simple-tun: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.7/crtend.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
simple-tun:(.data+0x10): first defined here
/usr/bin/ld: error in simple-tun(.eh_frame); no .eh_frame_hdr table will be created.
collect2: error: ld returned 1 exit status

我无法在搜索中找到解决方案。我的代码有什么根本性的错误吗?有人可以帮助我发现我做错了什么吗?

如果我需要发布更多片段或更多输出,请告诉我。

最佳答案

  1. 您不能像那样使用 PTHREAD_MUTEX_INITIALIZER - 它必须用作初始值设定项,而不是在正则赋值表达式中。您有两种选择来修复它 - 调用 pthread_mutex_init(),或添加类型转换以将 PTHREAD_MUTEX_INITIALIZER 用作复合文字。您的选择:

    pthread_mutex_init(&q->mutex, NULL);

    或:

    q->mutex = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;
  2. 您的链接器错误问题是由以下命令行引起的:

    gcc simple-tun.c simple-tun -lpthread

    您缺少 -o,因此您试图将程序与其自身链接。这是个坏消息。您可能想要的是:

    gcc simple-tun.c -o simple-tun -lpthread

    实际上,您也应该在其中添加一些警告标志。

关于C pthread互斥: Expected expression before `{' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864095/

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