引用或复制结构的结构(已分配的memset)是一件有效的事情
is referencing or copying a struct of a struct (memset allocated) a valid thing to do?
为了在线程(pthread)中使用网络信息(udp-sockaddr_In和套接字编号),我在主函数中设置了udp-socket,然后我想创建一个结构,其中包含((sockaddr_In),它是一个结构和(int socket))作为pthread_create函数的参数。
将结构从main中创建的套接字复制到全局函数(用于线程)中是一件危险的事情吗?因为它是在堆栈之外分配的,或者引用它会更好
我想做的是:
rc = pthread_create(&thread1, NULL, myfunction, (void *) &StructArg);
其中thread1是我想要使用(void)myfunction(voidStructArg)的位置
假设(sockaddr_in-Addrem)在被memset 后已经被填充
struct NetworkInfo { sockaddr_in remote ; int socket ;} ;
NetworkInfo NI;
NI.remote= Addrem;
NI.socket=sock; // from socket(sock,.....)
或者有更好的方法吗
我衷心感谢您的投入。
非常感谢
这取决于结构的分配位置。您必须确保结构在线程结束之前一直保留在内存中。如果结构被声明为调用pthread_create()
的函数的局部变量,这是危险的,例如:
void somefunc()
{
struct NetworkInfo NI;
// fill NI as needed...
rc = pthread_create(&thread1, NULL, &myfunction, &NI);
}
除非您在线程上加入相同的函数以等待它终止:
void somefunc()
{
struct NetworkInfo NI;
// fill NI as needed...
rc = pthread_create(&thread1, NULL, &myfunction, &NI);
// ...
pthread_join(thread1, ...);
}
否则,您将不得不将结构声明为全局变量(并且永远不要创建同时使用它的多个线程):
struct NetworkInfo NI;
void* myfunction(void *arg)
{
// use NI as needed...
return ...;
}
void somefunc()
{
rc = pthread_create(&thread1, NULL, &myfunction, NULL);
}
或者在堆上分配结构,并在使用它时让线程释放它:
void* myfunction(void *arg)
{
struct NetworkInfo *NI = (struct NetworkInfo*) arg;
// use NI as needed...
free(NI);
return ...;
}
void somefunc()
{
struct NetworkInfo *NI = malloc(sizeof(struct NetworkInfo));
// fill NI as needed...
rc = pthread_create(&thread1, NULL, &myfunction, NI);
}
或者:
#include <memory>
void* myfunction(void *arg)
{
std::auto_ptr<struct NetworkInfo> NI( (struct NetworkInfo*) arg );
// use NI as needed...
return ...;
}
void somefunc()
{
std::auto_ptr<struct NetworkInfo> NI(new struct NetworkInfo);
// fill NI as needed...
rc = pthread_create(&thread1, NULL, &myfunction, NI.get());
NI.release();
}
相关文章:
- 在 c++ 中拥有一组结构的正确方法是什么?
- 为什么make_tie不是一件事
- 不知道如何在家庭作业任务中实现一件事
- 如何使结构一次只存储一个变量?C++
- <<是一件C++的事情 - 相当于Java。
- 为什么会这样?堆,展示了一件事,然后又展示了另一件事
- 使用windows.h是一件好事吗?
- C++:关于加载 DLL 和调用函数的一件小事
- 虚拟析构函数会是一件坏事吗?
- 引用或复制结构的结构(已分配的memset)是一件有效的事情
- 我在wxPaint DC绘图中发现了一件奇怪的事情
- 通过多重私有继承扩展类-这是一件事吗
- 加工va_list一件一件
- 没有明显目标的std::cout在已发布代码中是一件不好的事情吗?
- 状态检查总是一件有效的事情吗
- 递归是一件坏事吗?在递归似乎最有用的地方,是否有更清晰或更有效的方法来解决问题?
- 使用 cpp 宏作为脚本语言是一件坏事吗?
- 指针强制转换以满足方法参数是一件危险的事情吗?
- 如何在Windows上每毫秒做一件事或做得更好
- 我做了一件阴暗的事情