<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: pthread_create + полиморфизм = проблема с передачей 4 аргумента</title>
    <link>https://slinkov.ru/openforum/vsluhforumID9/9432.html</link>
    <description>Добрый день, друзья.&lt;br&gt;При написании многопоточного сервера столкнулся со странной проблемой.&lt;br&gt;Попробую как могу описать суть.&lt;br&gt;Вначале всё работало и выглядело примерно так:&lt;br&gt;&lt;br&gt;bool TCP_parent::listen() &#123;&lt;br&gt;  int new_socket = ::accept(...);&lt;br&gt;  pthread_create(&amp;thread1, NULL, start_routine, (void*) &amp;socket);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Потом я переместил вызов функции pthread_create в дочерний класс, точнее переопределил родительский метод TCP_parent::accept:&lt;br&gt;&lt;br&gt;bool TCP_parent::listen() &#123;&lt;br&gt;  int new_socket = ::accept(...);&lt;br&gt;  accept(new_socket);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;bool TCP_child::accept(int sock) &#123;&lt;br&gt;  pthread_create(&amp;thread1, NULL, start_routine, (void*) &amp;sock);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;После этой безобидной операции функция потока start_routine перестала получать свой аргумент sock. Точнее после разыменования аргумента *((int*)ptr) получалось что-то неудобочитаемое, типа 134515204. Может в g++ не работает как надо полиморфизм?&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;# uname -a&lt;br&gt;FreeBSD srv-prog2.ru 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:55:53 UTC 2010     root&#064;almeida.cse.buffalo.edu:</description>

<item>
    <title>pthread_create + полиморфизм = проблема с передачей 4 аргумента (anselm)</title>
    <link>https://slinkov.ru/openforum/vsluhforumID9/9432.html#3</link>
    <pubDate>Fri, 13 Apr 2012 02:53:24 GMT</pubDate>
    <description>&amp;gt;&amp;gt; bool TCP_parent::listen() &#123; &lt;br&gt;&amp;gt;&amp;gt;   int new_socket = ::accept(...); &lt;br&gt;&amp;gt;&amp;gt;   pthread_create(&amp;thread1, NULL, start_routine, (void*) &amp;socket); &lt;br&gt;&amp;gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; Вы, конечно, понимаете, да,  что передаете в функцию которая запускается во &lt;br&gt;&amp;gt; втором thread&apos;e адрес локальной переменной которая размещеня в стеке перого thread&apos;a? &lt;br&gt;&amp;gt; (В смысле, что нет никакой гарантии что в тот момент когда &lt;br&gt;&amp;gt; start_routine() во втором thread&apos;е попытается прочитать значение типа int по этому &lt;br&gt;&amp;gt; адресу, TCP_parent::listen() в первом thread&apos;е уже может завершится и ее локальнй &lt;br&gt;&amp;gt; переменной new_socket (адрес которой и был передан) может не существовать?) &lt;br&gt;&lt;br&gt;Это я упустил. Получается, надо создать динамическую переменную:&lt;br&gt;&lt;br&gt;bool TCP_parent::listen() &#123; &lt;br&gt;  int* new_socket = new int( ::accept(...) );&lt;br&gt;  pthread_create(&amp;thread1, NULL, start_routine, (void*) new_socket); &lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;- а функция start_routine должна взять на себя уничтожение этой переменной.&lt;br&gt;&lt;br&gt;Да, всё заработало. Вы ответили на мой вопрос. Большое спасибо!&lt;br&gt;</description>
</item>

<item>
    <title>pthread_create + полиморфизм = проблема с передачей 4 аргумента (elvenic)</title>
    <link>https://slinkov.ru/openforum/vsluhforumID9/9432.html#2</link>
    <pubDate>Thu, 12 Apr 2012 14:30:48 GMT</pubDate>
    <description>&amp;gt; bool TCP_parent::listen() &#123; &lt;br&gt;&amp;gt;   int new_socket = ::accept(...); &lt;br&gt;&amp;gt;   pthread_create(&amp;thread1, NULL, start_routine, (void*) &amp;socket); &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&lt;br&gt;Вы, конечно, понимаете, да,  что передаете в функцию которая запускается во втором thread&apos;e адрес локальной переменной которая размещеня в стеке перого thread&apos;a? (В смысле, что нет никакой гарантии что в тот момент когда start_routine() во втором thread&apos;е попытается прочитать значение типа int по этому адресу, TCP_parent::listen() в первом thread&apos;е уже может завершится и ее локальнй переменной new_socket (адрес которой и был передан) может не существовать?) &lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>pthread_create + полиморфизм = проблема с передачей 4 аргумента (anselm)</title>
    <link>https://slinkov.ru/openforum/vsluhforumID9/9432.html#1</link>
    <pubDate>Thu, 12 Apr 2012 10:45:36 GMT</pubDate>
    <description>Всем спасибо, причину нашёл.&lt;br&gt;Неверно определил аргумент:&lt;br&gt;&lt;br&gt;-bool TCP_child::accept(int sock)&lt;br&gt;&lt;br&gt;+bool TCP_child::accept(const int&amp; sock)&lt;br&gt;</description>
</item>

</channel>
</rss>
