[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-hackers
Subject:    Re: select and threads again
From:       Terry Lambert <tlambert () primenet ! com>
Date:       1999-01-30 23:46:45
[Download RAW message or body]

> Finally I found why select hangs. In multithread mode ILU uses pipe()
> for "communicational channel" between threads. So each select actually is
> waiting on two FD - first is the socket and second is the pipe. I don't know
> why in that situation select hangs forever. If I force select to wait only on
> single socket, then it works. I guess there are still some restrictions for
> select in multithread environment.

The real non-libc_r wrapped select is supposed to be called by the
wrapping select using a zero valued timeval struct (effecting a "poll")
when there are other threads ready to run.

When all threads are blocked pending I/O on fd's, then a real select is
called on all of the fd's on which I/O is pending with a NULL pointer
instead of a zero valued timeval struct.  This makes the select hang
until I/O is available on one or more of the fd's.

If you are getting a blocking select, then the only possible cause
is that the scheduler believes that there are no other threads in
a read-to-run state, and therefore makes the blocking call instead
of call converting it to a polling call which, if not input is
pending, is followed by a threads context switch.


Perhaps you are both read and write selecting the pipe fd, in two
seperate threads?

In general, write selecting is a bad idea.

This may be a problem in the pipe code, or in the wrapping function
in libc_r (unlikely).

You could try using a POSIX domain socket instead of a pipe; it uses
the same underlying code (man socketpair).  If this also hangs, try
using a real socket (AF_INET instead of AF_UNIX).

Also, make sure you are not using fork(), since it interacts badly
with threads.


					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic