Разочарован моей программой "Зависание при возврате с каналом ожидания" от futex_wait_queue_me - PullRequest
0 голосов
/ 18 июля 2011

Я работаю над серверным проектом.По сути, когда сервер запускается, ему нужно привязать порт сокета (скажем, 1935).

Моя проблема в том, что если запущен другой экземпляр моей программы, то есть используется порт сокета 1935, тоновый экземпляр моей программы будет зависать при возврате в main ().

Информация об ошибке:

Error starting server: SocketException: in Socket::bind: ADDRINUSE

При возникновении ошибки логика моей программы попытается return -1.Перед выходом из программы return -1 сначала освободит системный ресурс, конкретная строка, которая вызывает зависание:

pthread_join ( tid_, 0 )

А из системного монитора (gnome-system-monitor) я вижу:

Process Name  | Status   | % CPU | Nice | ID    | Memory    | Waiting Channel
MyProgramName | Sleeping |   0   |  0   | 28573 | 300.0 KiB | futex_wait_queue_me

Многопоточная часть моего проекта была написана кем-то другим, и документации нет.Так что я как бы застрял здесь.

Пожалуйста, помогите мне.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.Я сделаю все возможное, чтобы добавить.

А вот моя основная () логика:

MyServer server(host, port); // When `return -1` is called, this line will eventually call `pthread_join (tid, 0)`
try
{
    server.init(config);
}
catch (const MyException& e)
{
    DebugUtils::Error(boost::format("Error initializing server: %1% [%2%].")
                      % e.what() % e.GeneralMessage);
    return -1;
}
catch (const std::exception& e)
{
    DebugUtils::Error(boost::format("Error initializing server: %1%.")
                      % e.what());
    return -1;
}
catch (...)
{
    DebugUtils::Error("Unknown error initializing server.");
    return -1;
}

try
{
    server.start();
}
catch (const MyException& e)
{
    DebugUtils::Error(boost::format("Error starting server: %1% [%2%].")
                      % e.what() % e.GeneralMessage);
    return -1;
}
catch (const std::exception& e)
{
    DebugUtils::Error(boost::format("Error starting server: %1%.")
                      % e.what()); // This line output the error info
    return -1; // This line will first free the resource, so it will call the destructor of MyServer on the first line in this code snippet.
}
catch (...)
{
    DebugUtils::Error("Unknown error starting server.");
    return -1;
}

Питер

1 Ответ

0 голосов
/ 18 июля 2011

Я подозреваю, что вам нужно сообщить о состоянии или добавить элемент в очередь событий, чтобы разбудить подпоток, чтобы он мог выйти до того, как вы выполните вызов pthread_join.

...