【发布时间】:2019-02-15 19:59:01
【问题描述】:
如何以更简洁的方式将可变参数数据从一个函数传递到另一个函数?
演示代码:
void * variadic_data = nullptr;
void send_1(){
if(sendto(...)){
variadic_data = static_cast<void *>(new int(123)); // from here
}
}
void send_2(){
if(sendto(...)){
variadic_data = static_cast<void *>(new std::string("test"));
}
}
void task(){
...
do {
i_result = recv(...);
std::string message(buff, i_result);
if(message == ...){
int * int_1 = static_cast<int *>(variadic_data); // to here
...
delete int_1 ;
} else if (message == ...) {
std::string * str_1 = static_cast<std::string *>(variadic_data);
...
delete str_1;
}
} while(i_result != 0 && i_result != SOCKET_ERROR);
}
我有额外的recv线程和少数其他线程sendto函数,许多sendto有不同的局部变量,在recv线程响应后需要。我认为在额外的线程中阻塞 recv 是常见的方式。这只是糟糕的应用程序设计吗?我应该创建消息管理器并在 sendto 之后立即选择吗?
【问题讨论】:
-
为什么
variadic_data有多种内容?为什么不分开变量?为什么是全球性的?为什么std::variadic不起作用?为什么这看起来像一个消息泵,其中额外的数据存储在全局而不是消息中? -
@MooingDuck
variadic_data有多种类型的内容,因为我尽量避免为每个发送本地类型使用单独的变量。它是全局的,因为每个函数都可以访问。std::variadic你的意思是可变参数?它们不起作用,因为任务已经在运行。当服务器根本不需要它们时,为什么要在消息中发送额外的数据? -
对不起,我的意思是
std::variant。但是你不应该有全局变量。一般来说,可变全局变量几乎总是一个坏主意,并且会导致错误。
标签: c++ multithreading networking