Я работаю над серверным проектом.По сути, когда сервер запускается, ему нужно привязать порт сокета (скажем, 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;
}
Питер