简体   繁体   中英

How do I use the pthreads in a ROS C++ Node

I am trying to use pthread library inside the ros Node, I am including it as #include <pthread> . When I run catkin_make I get the error below. I created a simple thread as std::thread m1(move, 1);

thread: No such file or directory
 #include <pthread>
          ^~~~~~~~~

The signature of the move function is void move(short axis_no, short direction = 0) and I instantiated the thread as

std::thread m1(move, 1);    
m1.join();

I tried to add the pthread library in my CmakeLists.txt as follows add_compile_options(-std=c++11 -pthread) and target_link_libraries(pthread) . Is there a way I can use the pthread library inside the ros Node?

Thank you.

pthread is a C library available on some platforms and if you want to use the pthread_* functions you need to #include <pthread.h> .

Since C++11 there is an abstraction layer on top of the native threading libraries which is available if you instead #include <thread> .

You can then use std::thread - but you will still need to link with -pthread .

Instead of hardcoding -pthread , you can let CMake find and add the appropriate library:

find_package(Threads REQUIRED)
target_link_libraries(your_app PRIVATE Threads::Threads)

In your program, the move function needs two arguments (the function signature is void(*)(short, short) even if you have a default value for direction ).

#include <thread>
#include <iostream>

void move(short axis_no, short direction = 0) {
    std::cout << axis_no << ' ' << direction << '\n';
}

int main() {
    auto th = std::thread(move, 1, 2); // needs 2 arguments
    th.join();
}

If you want, you can create an overload to only have to supply one argument, but in that case you also need to help the compiler to select the correct overload.

#include <thread>
#include <iostream>

void move(short axis_no, short direction) { // no default value here
    std::cout << axis_no << ' ' << direction << '\n';
}

void move(short axis_no) { // proxy function
    move(axis_no, 0);      // where 0 is default
}

int main() {
    using one = void(*)(short);
    using two = void(*)(short, short);

    // use one of the above type aliases to select the proper overload:
    auto th = std::thread(static_cast<one>(move), 1);
    th.join();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM