<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: аргумент типа int для pthread_create в x86_64</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html</link>
    <description>Код на С, портирую с x86 на x86_64 многопоточный сервер (точнее, превращаю его в многоплатформенный, чтобы работало и там и там, т.е. например unsigned int =&amp;gt; uint32_t и другие вещи), так вот, после accept-a нужно передать сокет (тип int) в поток, делается это последним параметром фунции pthread_create, вот код:&lt;br&gt;&lt;br&gt;...&lt;br&gt;socklen_t addr_len;&lt;br&gt;addr_len = sizeof(fsin);&lt;br&gt;accepted_socket = accept(s, (struct sockaddr *)&amp;fsin, &amp;addr_len);&lt;br&gt;....&lt;br&gt;....&lt;br&gt;pthread_create(&amp;th, &amp;ta, (void * (*)(void *))parser, (void *)accepted_socket)&lt;br&gt;&lt;br&gt;вот как объявлена функция pthread_create:&lt;br&gt;&lt;br&gt;int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);&lt;br&gt;&lt;br&gt;&lt;br&gt;И так, так-как в x86_64 тип указатель (void*) это 64-битное число, а int - 32-битное, GCC выдает warning:&lt;br&gt;&lt;br&gt;pthread_create warning: cast to pointer from integer of different size&lt;br&gt;&lt;br&gt;Программа работает, и ошибок и быть не может, потому что ничего не вырезается, а наоборот, но вот как лучше всего сделть чтобы</description>

<item>
    <title>аргумент типа int для pthread_create в x86_64 (Michelnok)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html#7</link>
    <pubDate>Thu, 28 Jan 2010 14:49:50 GMT</pubDate>
    <description>&amp;gt;Кстати, что гласит стандарт на тему sizeof(int) &amp;lt;= sizeof(void *)? &lt;br&gt;&lt;br&gt;AFAIK, ничего.&lt;br&gt;</description>
</item>

<item>
    <title>аргумент типа int для pthread_create в x86_64 (const86)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html#6</link>
    <pubDate>Tue, 26 Jan 2010 22:03:47 GMT</pubDate>
    <description>&amp;gt;Тогда пришлось бы для каждой структуры делать malloc, потом free&lt;br&gt;&lt;br&gt;Если количество потоков фиксировано или ограничено небольшим числом, то можно завести статичный массив под параметры. Иначе да, придётся делать malloc/free.&lt;br&gt;&lt;br&gt;Кстати, что гласит стандарт на тему sizeof(int) &amp;lt;= sizeof(void *)?&lt;br&gt;</description>
</item>

<item>
    <title>аргумент типа int для pthread_create в x86_64 (Аноним)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html#5</link>
    <pubDate>Tue, 26 Jan 2010 17:24:28 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Конечно, можно решить проблему используя еще одну переменную &quot;прокси&quot;, но как-то не Ъ.&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;По такой логике, Ъ был предыдущий автор, за которым вы сейчас исправляете. &lt;br&gt;&amp;gt;Заведите структуру (с одним полем int) и передавайте в поток указатель &lt;br&gt;&amp;gt;на неё. Метод работает всегда одинаково и не нужно изобретать каждый &lt;br&gt;&amp;gt;раз новые хаки. &lt;br&gt;&lt;br&gt;Тогда пришлось бы для каждой структуры делать malloc, потом free (иначе, будет небезопасно передавать всем потокам указатель на одну и ту же переменную (хоть локальную хоть глобальную), так как поток может и не успеть прочитать ее перед тем как она изменится для следующего потока в цикле). А делать malloc и free в программе, в которой до этого динамически выделяемая память не использовалась, я не стал, ведь нужно передать только один парметр.&lt;br&gt;&lt;br&gt;P.S.&lt;br&gt;Я не очень опытный кодер на С, так что может что-то и недопонимаю ;)&lt;br&gt;</description>
</item>

<item>
    <title>аргумент типа int для pthread_create в x86_64 (const86)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html#4</link>
    <pubDate>Tue, 26 Jan 2010 12:18:31 GMT</pubDate>
    <description>&amp;gt;Конечно, можно решить проблему используя еще одну переменную &quot;прокси&quot;, но как-то не Ъ.&lt;br&gt;&lt;br&gt;По такой логике, Ъ был предыдущий автор, за которым вы сейчас исправляете. Заведите структуру (с одним полем int) и передавайте в поток указатель на неё. Метод работает всегда одинаково и не нужно изобретать каждый раз новые хаки.&lt;br&gt;</description>
</item>

<item>
    <title>аргумент типа int для pthread_create в x86_64 (Michelnok)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html#3</link>
    <pubDate>Sun, 24 Jan 2010 21:49:32 GMT</pubDate>
    <description>&amp;gt; Почему явное преобразование из int в void* генерирует warning? &lt;br&gt;&lt;br&gt;Не знаю, покопайтесь на сайте GNU.&lt;br&gt;Предполагаю, что есть опасение перед преобразованием потенциально отрицательного 32-битного числа к беззнаковому 64-битному. Кстати, тогда наверное корректнее приводить к uintptr_t, а не к intptr_t. И сначала int в unsigned. Тогда точно враг не пройдет :)&lt;br&gt;</description>
</item>

<item>
    <title>аргумент типа int для pthread_create в x86_64 (Аноним)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html#2</link>
    <pubDate>Sun, 24 Jan 2010 21:20:17 GMT</pubDate>
    <description>&amp;gt;#include &amp;lt;stdint.h&amp;gt; &lt;br&gt;&amp;gt;... &lt;br&gt;&amp;gt;pthread_create(&amp;th, &amp;ta, (void * (*)(void *))parser, (void *)(intptr_t)accepted_socket) &lt;br&gt;&lt;br&gt;Спасибо! А можежь объяснить почему нужно два раза делать cast? Почему явное  преобразование из int в void* генерирует warning?&lt;br&gt;</description>
</item>

<item>
    <title>аргумент типа int для pthread_create в x86_64 (Michelnok)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8596.html#1</link>
    <pubDate>Sun, 24 Jan 2010 20:57:48 GMT</pubDate>
    <description>#include &amp;lt;stdint.h&amp;gt; &lt;br&gt;...&lt;br&gt;pthread_create(&amp;th, &amp;ta, (void * (*)(void *))parser, (void *)(intptr_t)accepted_socket) &lt;br&gt;</description>
</item>

</channel>
</rss>
