1

我有mutlithread通过sockets. 我用这种结构创建新线程:

 pthread_t thread;
 pthread_create(&thread, NULL, c->sendMessage, (void *) fd);

wherefd是连接的 ID,c->sendMessage是一个函数,在创建新线程后调用并处理该线程。在这个函数中,我需要通过发送一些消息send(int sockfd, const void *buf, size_t len, int flags);

所以我是sockfd这样的:

void * Client::sendMessage(void *threadid) {
   int sockfd = (int) threadid;
   // some more code here and in the end I send the data via send(int sockfd, const void *buf, size_t len, int flags)
}

我用-pedantic标志编译,大多数编译器(包括我的)在编译过程中不会抛出任何警告或错误。但是有些人在编译过程中抛出一个错误,说这种从void *to重新输入int是不安全的,并且可能导致loose of precision. 我明白,这不是一个好的解决方案,应该做得更干净。但我不知道怎么做。任何人都可以建议我任何干净的做法,如何将 ponter 重新输入为 int 并在编译期间避免任何警告?

4

3 回答 3

5

发送指针而不是整数有什么问题?转换intvoid*void*int它不是标准的符合解决方案。

pthread_create(&thread, NULL, c->sendMessage, new int(fd));

int* sockfd_ptr = (int*)threadid;
// some usage
delete sockfd_ptr;

任何指针都可以转换为void*,因此它应该可以正常工作。不要忘记threadid在程序的某个地方删除。可能最好创建一些存储引用/指针的类。

另外,我不明白,您如何将成员函数发送到 C 函数中,这也不正确。

于 2013-06-07T11:41:53.980 回答
2

inttovoid*再转换回 to是一个非常糟糕的主意,int因为 C++ 标准中绝对不能保证这两种类型的大小相同。

如果您确实必须在整数类型和指针之间进行转换(这不是一个好主意,但有时没有其他选择),请使用intptr_toruintptr_t代替,int因为它们保证与指针的大小相同。这样你就不会收到任何警告。

附带说明一下,像您所做的遗留 C 转换在 C++ 中是不受欢迎的,因为您无法确定它们在幕后做什么(可能是 astatic_cast或 a reinterpret_cast,谁知道?)。更喜欢使用正确的 C++ 强制转换,即reinterpret_cast在您的情况下。

于 2013-06-07T11:49:05.273 回答
0

您可以添加类似static_assert(sizeof(fd) <= sizeof(void*), "problem"), 并依赖 reinterpret_cast 将在这种情况下往返的实现文档。

于 2013-06-07T11:47:31.150 回答