cpp-ipc icon indicating copy to clipboard operation
cpp-ipc copied to clipboard

自定义结构体send端卡住

Open ahao1995 opened this issue 4 years ago • 1 comments


#include <signal.h>

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <atomic>

#include "libipc/ipc.h"
#include <chrono>

namespace {

std::atomic<bool> is_quit__ {false};
ipc::channel *ipc__ = nullptr;
struct data
{
    long time;
    double msg;
};
inline long getNano()
{
        return std::chrono::duration_cast<std::chrono::nanoseconds>(
                   std::chrono::system_clock::now().time_since_epoch())
            .count();
}
void do_send(int size, int interval) {
    ipc::channel ipc {"ipc_test", ipc::sender};
    ipc__ = &ipc;
    std::string buffer(size, 'A');
    while (!is_quit__.load(std::memory_order_acquire)) {
        data tmp;
        tmp.time = getNano();
        ipc::buff_t d(&tmp,sizeof(data));
        ipc.send(d, 0/*tm*/);
        std::this_thread::sleep_for(std::chrono::milliseconds(interval));
    }
}

void do_recv(int interval) {
    ipc::channel ipc {"ipc_test", ipc::receiver};
    ipc__ = &ipc;
    while (!is_quit__.load(std::memory_order_acquire)) {
        ipc::buff_t recv;
        for (int k = 1; recv.empty(); ++k) {
            recv = ipc.recv(interval);
            data* d = (data*)recv.data();
            std::cout<<d->time<<std::endl;
            if (is_quit__.load(std::memory_order_acquire)) return;
        }
        std::cout << "recv size: " << recv.size() << "\n";
    }
}

} // namespace

int main(int argc, char ** argv) {
    if (argc < 3) return -1;

    auto exit = [](int) {
        is_quit__.store(true, std::memory_order_release);
        if (ipc__ != nullptr) ipc__->disconnect();
    };
    ::signal(SIGINT  , exit);
    ::signal(SIGABRT , exit);
    ::signal(SIGSEGV , exit);
    ::signal(SIGTERM , exit);
#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || \
    defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \
    defined(WINCE) || defined(_WIN32_WCE)
    ::signal(SIGBREAK, exit);
#else
    ::signal(SIGHUP  , exit);
#endif

    std::string mode {argv[1]};
    if (mode == "send") {
        if (argc < 4) return -1;
        do_send(std::stoi(argv[2]) /*size*/, 
                std::stoi(argv[3]) /*interval*/);
    } else if (mode == "recv") {
        do_recv(std::stoi(argv[2]) /*interval*/);
    }
    return 0;
}

我使用了自己定义的结构体,recv接收了一会后卡住了,cpu100%,send recv传入参数均为为1 1,pstack信息如下 #0 0x00007ffe2fdeeb04 in clock_gettime () #1 0x00007f8cf2ef2ea2 in clock_gettime () from /lib64/libc.so.6 #2 0x0000000000429938 in a0_time_mono_now () #3 0x00000000004229cb in ipc::detail::calc_wait_time(timespec&, unsigned long) () #4 0x0000000000422aa2 in ipc::detail::make_timespec(unsigned long) () #5 0x0000000000423660 in ipc::detail::sync::robust_mutex::lock(unsigned long) () #6 0x0000000000423fd4 in ipc::detail::sync::mutex::lock(unsigned long) () #7 0x0000000000423510 in ipc::sync::mutex::lock(unsigned long) () #8 0x0000000000417b8d in std::lock_guardipc::sync::mutex::lock_guard(ipc::sync::mutex&) () #9 0x0000000000416ef7 in ipc::detail::waiter::broadcast() () #10 0x0000000000416f4e in ipc::detail::waiter::quit_waiting() () #11 0x00000000004064c0 in (anonymous namespace)::conn_info_head::quit_waiting() () #12 0x000000000040bc67 in (anonymous namespace)::queue_generator<ipc::policy::choose<ipc::circ::elem_array, ipc::wr<(ipc::relat)1, (ipc::relat)1, (ipc::trans)1> >, 64ul, 16ul>::conn_info_t::disconnect_receiver() () #13 0x0000000000409590 in (anonymous namespace)::detail_impl<ipc::policy::choose<ipc::circ::elem_array, ipc::wr<(ipc::relat)1, (ipc::relat)1, (ipc::trans)1> > >::disconnect(void*) () #14 0x00000000004178a0 in ipc::chan_impl<ipc::wr<(ipc::relat)1, (ipc::relat)1, (ipc::trans)1> >::disconnect(void*) () #15 0x00000000004042c0 in ipc::chan_wrapper<ipc::wr<(ipc::relat)1, (ipc::relat)1, (ipc::trans)1> >::disconnect() () #16 0x0000000000403516 in main::{lambda(int)#1}::operator()(int) const () #17 0x0000000000403533 in main::{lambda(int)#1}::_FUN(int) () #18 #19 0x00000000004033d3 in (anonymous namespace)::do_recv(int) () #20 0x00000000004037a5 in main ()

ahao1995 avatar Nov 23 '21 15:11 ahao1995

可能是send 在tm = 0的时候的bug?我最近比较忙,等我有空了看看 你试试把tm参数改大一点,看看还有没有这个问题

mutouyun avatar Nov 27 '21 15:11 mutouyun