[mpich-discuss] Multithread server using MPICH-2

Rajeev Thakur thakur at mcs.anl.gov
Mon Sep 22 21:13:59 CDT 2008


If compiling with -g causes it to fail, there is probably some race
condition in your program.
 
Rajeev


  _____  

From: owner-mpich-discuss at mcs.anl.gov
[mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Gisele Machado de
Souza
Sent: Monday, September 22, 2008 3:49 PM
To: mpich-discuss at mcs.anl.gov
Subject: Re: [mpich-discuss] Multithread server using MPICH-2


People, help me. 
Like I said in my previous message, my application worked when I compile the
library with the options:

./configure  --enable-romio --without-mpe --with-pm=mpd
--with-device=ch3:sock --enable-threads=multiple --with-thread-package=posix


I did a safe copy of the version that is working. 

But when I test remove all .o  and executable files, and  compile again, the
application stops working.
(and my safe copy is working)

In my makefile I put:

CFLAGS = -g
CLIBS = -lpthread -lm

I need to compile with more options to make it work?


2008/9/19 Gisele Machado de Souza <giselemachad at gmail.com>


People, thank you all!!!
I find a solution. I used mpich2-1.0.7 and compiled with this options:

> ./configure  --enable-romio --without-mpe --with-pm=mpd
--with-device=ch3:sock --enable-threads=multiple --with-thread-package=posix


and I included this instructions from phtreads:

> pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
   rc = pthread_create(&threads[t], &attr, threadfunc, (void *) listParam);

It works!!!


I hope not have more problems and I hope that the library is really stable
for this type of situation.

If I have any other problem I turn to send messages. 
Thank you for helping!!!!







2008/9/19 Rajeev Thakur <thakur at mcs.anl.gov> 


Can you send us a small test case to reproduce the problem?
 
Rajeev


  _____  

From: owner-mpich-discuss at mcs.anl.gov
[mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Gisele Machado de
Souza
Sent: Thursday, September 18, 2008 11:04 PM
To: mpich-discuss at mcs.anl.gov
Subject: [mpich-discuss] Multithread server using MPICH-2


Hello,

I'm implementing a server in MPI that accepts more than one connection from
clients at the same time.
For do that I used MPI(mpich2-1.1.0a1.tar.gz) and pthreads.

What I want to do is a server that stays in a infinity loop waiting for
connections (MPI_Comm_accept(portMD, MPI_INFO_NULL, 0, MPI_COMM_WORLD,
newCommClient);). When a connection is established, he creates a new thread
and return to wait more connections.  That means, the server and the thread
will work in parallel.

The function that the thread will execute calls mpi functions, like
MPI_probe, MPI_Get_count, MPI_Recv, MPI_Send,  MPI_Pack and  MPI_Unpack.

The problem I'm having is that the server and the thread are not working in
parallel successfully. Sometimes, the program hangs, do nothing, and in
another times a fatal error appears (Assertion failed in file sock_wait.i at
line 236: (pollfd->events & (0x001 | 0x004)) || pollfd->fd == -1).

When I put the server to sleep for a moment, before he will wait another
connection, during the time he was sleeping the created thread works fine.
Once the server wakes up and starts to wait for a connection, things stop
working.

A peace of my code (Server):
----------------------------------------------------------------------------
-------------------------------------------------
// arguments passed to a thread
typedef struct
{ MPI_Comm communicator;
  char * path1;
  char * path2;
  char * port;   
} ThreadParam;

 pthread_t threads[10];
 int t =0;
 int rc;


 ThreadParam * listParam = NULL;
 MPI_Comm * newCommClient;
    

  /* server  infinity loop */
 while (time_out > 10)
 {
   
     newCommClient = malloc(sizeof(MPI_Comm));
    
    
     /* waiting for a connection */
     MPI_Comm_accept(portMD, MPI_INFO_NULL, 0, MPI_COMM_WORLD,
newCommClient);
           
     listParam = malloc(sizeof(ThreadParam));      
     listParam->communicator = *newCommClient; //with this communicator the
thread will talk with the
/
//client 
     listParam->path1 = argv[2];
     listParam->path2 = argv[4];
     listParam->port = portMD;
    
     rc = pthread_create(&threads[t], NULL, threadfunc, (void *) listParam);
    
     if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
     }
     //sleep(1); 
     t++;
  }

----------------------------------------------------------------------------
-------------------------------------------------
Please, I need help to solve this problem!!

Thanks very mych!

Gisele




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/mpich-discuss/attachments/20080922/4eeb25c5/attachment.htm>


More information about the mpich-discuss mailing list