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