这是我第一次发表自己的问题,很抱歉,如果我以某种方式打破礼仪或某事。我正在研究的这个程序中的大多数软件都没有由我编码。我想用它们的一个函数创建一个线程。我想在线程中实现的函数看起来像这样。如果可能的话,我希望能够继续使用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"));
答案 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 ++。使用小写宏。使用它们来解决自己过长的参数列表。看似缺乏对命名空间的理解。这些对我来说似乎都是一个糟糕的设计选择,我不会惊讶地发现它们更多。