Использование posix semphores вопрос - PullRequest
0 голосов
/ 08 февраля 2011

Я удивляюсь, если я реализую это правильно, используя семафоры. Я хочу, чтобы 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 ?? ()

1 Ответ

1 голос
/ 09 февраля 2011

Я вижу цикл в вашем коде, так что вы, вероятно, имели в виду что-то вроде:

void* serverThread(void* sock)
{
    sem_wait(&empty);
    Handle handle((TCPSocket*)sock);
    handle.HandleAuthentication();
    sem_post(&full);
}

void* clientThread(void* sock)
{
    sem_wait(&full);
    cout << "Address is: -> " << Handle::getAddress() << " ------ " << Handle::getPort() << endl;
    sem_post(&empty);
}

int main()
{
    sem_init(&full, 0, 0);
    sem_init(&empty, 0, 1);
    ...

Если ваша программа аварийно завершает работу, то лучше скомпилировать ее с -O0 -g и запустить под gdb для проверки трассировки стека.

Или вы можете сделать ulimit -c unlimited в оболочке, чтобы файл ядра был создан автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...