使用define参数进行Pthread

时间:2014-08-25 17:47:08

标签: c++ multithreading pthreads

这是我第一次发表自己的问题,很抱歉,如果我以某种方式打破礼仪或某事。我正在研究的这个程序中的大多数软件都没有由我编码。我想用它们的一个函数创建一个线程。我想在线程中实现的函数看起来像这样。如果可能的话,我希望能够继续使用pthreads:

void * bpsk_continuous(
uhd::usrp::multi_usrp::sptr usrp,
const std::string &cpu_format,
const std::string &wire_format,
const std::string &file,
size_t samps_per_buff,
unsigned long long num_requested_samples,
double time_requested = 0.0,
bool bw_summary = false,
bool stats = false,
bool null = false,
bool enable_size_map = false,
bool continue_on_bad_packet = false
){//operations of function}

后来他们使用我不熟悉的语法,我假设我以某种方式定义了参数。我的第一个问题是下面的代码是做什么的。

#define bpsk_continuous_args(format) \
(usrp, format, wirefmt, file, spb, total_num_samps, total_time, bw_summary, stats, null, enable_size_map, continue_on_bad_packet)
//if (type == "float") recv_to_file<std::complex<float> >recv_to_file_args("fc32");

我的第二个问题是如何根据上面的语法创建一个运行bpsk_continuous参数的线程。我尝试了以下但没有骰子:

pthread_t t1;
pthread_create(&t1, NULL, bpsk_continuous,bpsk_continuous_args("fc32")); 

2 个答案:

答案 0 :(得分:3)

您应该创建辅助结构,并且启动例程,让我们说:

struct bpsh_args {
    uhd::usrp::multi_usrp::sptr usrp;
    std::string cpu_format;
    std::string wire_format;
    std::string file;
    size_t samps_per_buff;
    unsigned long long num_requested_samples;
    double time_requested;
    bool bw_summary;
    bool stats;
    bool null;
    bool enable_size_map;
    bool continue_on_bad_packet;
};

在开始例程中,您应该将它的唯一参数转换回bpsh_args:

void* start_routine(void* _args) {
    bpsh_args* args = static_cast<bpsh_args*>(_args);
    bpsk_continuous(args->usrp, args->cpu_format, ...);
}

然后用适当的数据填充bpsh_args,然后将指针作为pthread_create的最后一个参数传递给它,并将start_routine作为最后一个传递给它。

bpsh_args _bpsh_args;
_bpsh_args.usrp = ....;
_bpsh_args.cpu_format = "fc32";
...
pthread_create(&t1, NULL, start_routine, &_bpsh_args);

详情请咨询人或http://man7.org/linux/man-pages/man3/pthread_create.3.html

请注意,在启动新线程后,带有参数的struct在两个线程之间共享,如果变量_bpsh_args超出范围,_args将无效。也许你应该更好地在堆上分配它,或者添加一些同步原语以确保只要你在后代线程中使用_bpsh_args就活着。

答案 1 :(得分:0)

要回答你的第一个问题,#define做了什么,它就是一个所谓的宏。宏只是执行文本替换。只做一点研究,你会发现更多关于它们的信息,特别是它们通常被认为是C ++的一个邪恶特征。

然后,如果你需要排除使用像std :: thread这样的便携式方法(甚至是Boost的变种),试试这种方法:

void* thread_function(void* arg)
{
    assert(arg);
    std::string const& format = *static_cast<std::string*>(arg);
    return bpsk_continuous bpsk_continuous_args(format);
}

somewhere()
{
    std::string format = ...;
    pthread_create(.., &thread_function, &format, ..);
}

请注意,这个库来自我所说的伪劣C ++。使用小写宏。使用它们来解决自己过长的参数列表。看似缺乏对命名空间的理解。这些对我来说似乎都是一个糟糕的设计选择,我不会惊讶地发现它们更多。