Я удивляюсь, если я реализую это правильно, используя семафоры. Я хочу, чтобы clientThread выполнялся только после окончания serverThread.
Мой текущий код выдает ошибку (не ошибка компиляции / компоновщика) с «Закрыть программу» (только еслия печатаю в clientThread) Вот мой код:
void* serverThread(void* sock)
{
sem_wait(&mutex);
Handle handle((TCPSocket*)sock);
handle.HandleAuthentication();
sem_post(&mutex);
sem_post(&mutex2);
}
void* clientThread(void* sock)
{
sem_wait(&mutex2);
cout << "Address is: -> " << Handle::getAddress() << " ------ " << Handle::getPort() << endl;
sem_post(&mutex2);
}
int main()
{
sem_init(&mutex, 0, 1);
sem_init(&mutex2, 0, 0);
unsigned short echoServPort = 9898;
try {
TCPServerSocket servSock(echoServPort);
for (;;) {
TCPSocket* sock = servSock.accept();
pthread_t pidClient, pidServer;
if(pthread_create(&pidServer, NULL, serverThread, (void*)sock) != 0)
{
throw SocketException("Unable to create server thread (pthread_create()", true);
}
if(pthread_create(&pidClient, NULL, clientThread, NULL) != 0)
{
throw SocketException("Unable to create client thread (pthread_create()", true);
}
}
} catch (SocketException &e) {
cerr << e.what() << endl;
exit(1);
}
return 0;
}
edit: это ошибки после проверки с помощью gdb:
(gdb) bt
#0 0x6fcb6afb in libstdc++-6!_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES
5_PKc () from c:\MinGW\bin\libstdc++-6.dll
#1 0x0040146d in _fu0___ZSt4cout (sock=0x0) at ..\src\client.cpp:212
#2 0x6e0c5121 in ptw32_threadStart@4 () from c:\MinGW\bin\libpthread-2.dll
#3 0x76e01287 in msvcrt!_itow_s () from C:\Windows\system32\msvcrt.dll
#4 0x76e01328 in msvcrt!_endthreadex () from C:\Windows\system32\msvcrt.dll
#5 0x76cb1174 in KERNEL32!AcquireSRWLockExclusive ()
from C:\Windows\system32\kernel32.dll
#6 0x76efb3f5 in ntdll!RtlInsertElementGenericTableAvl ()
from C:\Windows\system32\ntdll.dll
#7 0x76efb3c8 in ntdll!RtlInsertElementGenericTableAvl ()
from C:\Windows\system32\ntdll.dll
#8 0x00000000 in ?? ()