performSelectorInBackground出现在> 1个线程

时间:2013-03-21 18:04:00

标签: objective-c multithreading sockets

当我尝试调度单个线程来轮询unix套接字时,我注意到一些奇怪的行为。 当我在osx 10.6.8上测试代码时,代码崩溃,我看到运行代码的多个线程。 奇怪的是,在osx 10.7.5上,当它崩溃时,我只看到它在一个线程上运行。

在我的AppDelegate中,我发送了这样的线程(一次):

[pp performSelectorInBackground:@selector(runloop) withObject:nil];

pp是My IPC类的一个实例。

在我的IPC类中,runloop是一些C代码的包装器

@implementation IPC
-(void) runloop
{
  ipc_busy = 0;
  unixsocket_runloop();
}

runloop意味着等待单个连接(每个运行时) 然后处理程序等待数据包,直到程序终止。 C代码看起来像这样 -

/**
 * Waits for a connection and dispatches the socket handler
 * No need to fork since we will only ever have a single connection per program launch
 */
int unixsocket_runloop()
{
  int connection_fd;
  socklen_t address_length;
  while((connection_fd = accept(socket_fd,
                                (struct sockaddr *) &address,
                                &address_length)) > -1)
  {
    return unixsocket_handler(connection_fd);
  }
  return 0; // for posterity
}

这是连接处理程序 -

/**
 * Handles the connection from the client
 * loops infinitely and reads from the socket when there is a message
 * Stores message into a ring buffer of buffers
 */
int unixsocket_handler(int connection_fd)
{
  size_t nbytes;
  char readbuffer[USBUFSIZE];
  bzero(readbuffer,USBUFSIZE);
  while((nbytes = read(connection_fd, readbuffer, USBUFSIZE)))
  {
    // store in buffer
    bufPut(readbuffer,nbytes);
    bzero(readbuffer,USBUFSIZE);
  }
  close(connection_fd);
  return 0;
}

在我的堆栈跟踪中,我看到这个unixsocket_runloop发生在2个线程中。 虽然我不相信这是崩溃的根本原因, 这是我想要解决的意外行为。

我通过自己的套接字类滚动的唯一原因是b / c我在开源社区中看到的很多选项都是硬连接到TCP。特别是吸引人的cocoaAsyncSocket类。

0 个答案:

没有答案