当前位置: 首页 > 知识库问答 >
问题:

在Raspbian上使用C++上的线程,不能编译

娄学文
2023-03-14
#include <iostream>
#include <thread>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int serverTask(int port){
    int n;
    char buffer[256];
    /* Socket File Descriptors */
    int socketFd, socketFdNew;
    socklen_t clientLength;

    struct sockaddr_in serverAddress, clientAddress;

    /* TCP Socket */
    socketFd = socket(AF_INET, SOCK_STREAM, 0);
    if(socketFd < 0){
        error("ERROR opening socket\n");
    }

    /* Fills serverAddress with zeroes */
    bzero((char *) &serverAddress, sizeof(serverAddress));

    /* ServerAddress configuration */
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_addr.s_addr = INADDR_ANY;
    serverAddress.sin_port = htons(port);

    /* Biding socket to server address */
    if(bind(socketFd, (struct sockaddr *) &serverAddress,sizeof(serverAddress)) < 0){
        error("ERROR on binding");
    }

    /* Listen for incoming connections, 5 is the number of queued devices */
    listen(socketFd,5);

    /* accept freezes the running thread until a client is found */
    clientLength = sizeof(clientAddress);
    socketFdNew = accept(socketFd, (struct sockaddr *) &clientAddress, &clientLength);
    if (socketFd < 0){
        error("ERROR on accept");
    }

    /* Fill buffer with zeroes */
    bzero(buffer,256);

    /* Reads up to 255 characters in the socket */
    n = read(socketFdNew, buffer, 255);
    if (n < 0){
        error("ERROR reading from socket");
    }

    printf("Received: %s\n",buffer);

    /* Responds with placeholder value */
    n = write(socketFdNew,"40.12\n",7);
    if (n < 0){
        error("ERROR writing to socket");
    }
    close(socketFdNew);
    close(socketFd);
    return 0;
}

int main()
{
    std::thread serverTask(7000);

    std::cout <<"Hello World!\n";

    serverTask.join();
    return 0;
}

因此,我尝试使用c++11,然后使用g++-wall-std=c++0x-pthread-o“main”“main.cpp”重新编译,得到以下结果:

在包含于/usr/include/c++/4.6/thread:39:0,from main.cpp:2:/usr/include/c++/4.6/functional:在成员函数中'void std::_bind_result<_result,_functor(_bound_args...)>::__call(std::tuple<_args...>&&,std::_index_tuple<_index...>,typename std::_bind_result<_result,,_functor=int,_bound_args={},typename std::_bind_result<_result,_functor(_bound_args...)>::_enable_if_void<_result>::type=int]':/usr/include/C++/4.6/function:1378:24:实例化自'std::_bind_result<_result,_functor(_bound_args...)>::result_type},std::_bind_result<_result,_functor(_bound_args...)>::result_type=void]“/usr/include/C++/4.6/thread:117:13:实例化自'void std::thread::_impl<_callable>::_m_run()[with_callable=std::_bind_result]'main.cpp:86:1:从这里实例化/usr/include/c++/4.6/functional:1287:4:error:'((std::_bind_result*)this)->std::_bind_result::_m_f'不能用作函数编译失败。

我最后的办法是安装G++4.9。安装完成后,我尝试使用g++-4.9-wall-std=gnu++0x-pthread-o“main”“main.cpp”,得到以下结果:

在文件include from/usr/include/c++/4.9/thread:39:0、from main.cpp:2:/usr/include/c++/4.9/functional:在'struct std::_bind_simple':/usr/include/c++/4.9/thread:140:47:required from'std::thread::thread(_callable&&,_args&&...)[with_callable=int;_args={}]'main.cpp:79:29:required from able(_args...)>::type result_type;^/usr/include/c++/4.9/functional:1695:9:错误:“class std::result_of”_m_invoke(_index_tuple<_indexes...>)中没有名为“type”的类型^编译失败。

现在我很困惑,我不知道我做错了什么。

#include <iostream>
#include <thread>
#include <stdio.h>


int serverTask(int port){
    return 0;
}

int main()
{
    std::thread serverTask(7000);


    std::cout <<"Hello World!\n";

    serverTask.join();
    return 0;
}

结果保持不变:

g++-4.9-wall-std=gnu++0x-pthread-o“test”“test.cpp”(在目录:/home/pi/tempserver中)包含在/usr/include/c++/4.9/thread:39:0,from test.cpp:2:/usr/include/c++/4.9/functional:在'struct std::_bind_simple'的实例化中:/usr/include/c++/4.9/thread:140:47:required from'std::thread::thread(_callable&&,C++/4.9/functional:1665:61:错误:“class std::result_of”typedef typename result_of<_callable(_args...)>::type result_type中没有名为“type”的类型;^/usr/include/c++/4.9/functional:1695:9:错误:“class std::result_of”_m_invoke(_index_tuple<_indexes...>)中没有名为“type”的类型^编译失败。

共有1个答案

余天宇
2023-03-14

这一行:

std::thread serverTask(7000);

声明一个名为ServerTask的变量,并尝试传递7000作为要在线程中运行的函数的名称。但是7000不是函数。不幸的是,G++在这里给出了非常神秘的错误消息。

你可能是说:

std::thread foo(serverTask, 7000);
 类似资料:
  • 问题内容: 在Linux上是否使用线程安全写入stdout ?使用下级命令怎么办? 问题答案: 它不是C标准指定的-取决于您对C标准库的实现。实际上,C标准甚至根本没有提到线程,因为某些系统(例如嵌入式系统)没有多线程。 在GNU实现()中,stdio中处理对象的大多数高级函数都是线程安全的。通常没有名字的(例如)。但是,线程安全性处于每个函数调用级别:例如,如果您多次调用,则保证每个调用都是原子

  • 问题内容: 我最近安装了Ubuntu 11.10,并安装了CodeBlocks IDE,并且我知道默认情况下我具有gcc和std库。 我的问题是: 您对在Ubuntu上使用新的C ++程序员有什么建议吗? 我应该从一开始就获得任何库? 我缺少一个非常好的IDE?(YMMV,但我更喜欢在IDE中工作) 从一开始我就应该意识到任何编程上的陷阱或陷阱吗? 问题答案: 在Ubuntu上,无需IDE即可使用

  • 在Linux上如何使用gcc编译c程序 如何安装gcc 编辑c代码 编辑代码 运行代码

  • 问题内容: 我正在尝试从线程中设置文本对象的字符串,但这给了我这个错误: 处理程序类: 我尝试使用,它确实可以工作,但是它使我的程序崩溃。我也尝试在该方法上创建一个Timer,但它给了我与以前相同的错误。 问题答案: 包起来。在它的外面,在while循环中,添加Thread.sleep(1000); 非法状态异常的原因是你试图在JavaFX Application线程以外的其他线程上更新UI。 添

  • 问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了: