Multithreading 使用posix符号组提问

Multithreading 使用posix符号组提问,multithreading,pthreads,Multithreading,Pthreads,如果我使用信号量正确实现这一点,我会很好奇。我希望clientThread仅在serverThread完成后执行。 我当前的代码给出了一个“Close program”(仅当我在clientThread中打印时)的错误(不是编译/链接器错误),下面是我的代码: void* serverThread(void* sock) { sem_wait(&mutex); Handle handle((TCPSocket*)sock); handle.HandleAuthen

如果我使用信号量正确实现这一点,我会很好奇。我希望clientThread仅在serverThread完成后执行。
我当前的代码给出了一个“Close program”(仅当我在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;
}

我在您的代码中看到了一个循环,所以您的意思可能是:

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);
    ...
void*serverThread(void*sock)
{
sem_等待(&empty);
把手(TCPSocket*)袜子;
handle.HandleAuthentication();
sem_职位(完整);
}
void*clientThread(void*sock)
{
sem_等待(&full);

是的,你的代码比X好,现在我还需要找出原因crashes@vBx只需使用
gdb运行。/u应用程序
。在gdb中输入
r
运行程序。然后在程序崩溃后输入
bt
(回溯)。我做了,但说实话,我什么都不懂…:(我把输出放在原稿中post@vBx是的,名称被弄乱了,不太方便。重要的一行:
#1 0x0040146d in_fu0___ZSt4cout(sock=0x0)位于..\src\client.cpp:212
看起来您在第212行的client.cpp中传递了一个NULL
sock
指针。这就是程序崩溃的原因。
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);
    ...