[Spread-users] spread 4.0rc2, C and multithreading

jabe at gfz-potsdam.de jabe at gfz-potsdam.de
Fri Oct 27 02:10:56 EDT 2006


I try to use spread in a multithreaded environment.
The main thread does all the connection handling while the listener thread 
reads incoming messages.
When I disconnect from the main thread, the listener thread receives an error 
(connection closed by spread) and terminates. That behavior is intended.

When I connect and disconnect, everything works as expected.
After connecting again, the listener thread will neither receive a message nor 
an error from spread anymore. The thread block in SP_receive and even if I 
call disconnect from the main thread, SP_receive does not receive the 
"connection closes by spread" error.

Do I miss something important?

Below I posted a minimal example of this problem.

System: Linux SuSE 10.1, 32bit, gcc 4.1, spread 4.0rc2

Regards,
Jan

------- source --------

#include <stdio.h>
#include <pthread.h>
#include "sp.h"

static mailbox mbox;
static char privateGroup[MAX_GROUP_NAME];
static pthread_t thread;

void* listen(void*) {
        service serviceType = 0;
        char sender[MAX_GROUP_NAME];
        int numGroups;
        char groups[10][MAX_GROUP_NAME];
        int16 msgType;
        int endianMissmatch;
        char message[1024];

        printf("[thread] starting listener thread\n");

        while ( true ) {
                int ret = SP_receive(mbox, &serviceType, sender, 10, 
&numGroups, groups,
                                     &msgType, &endianMissmatch, 1024, 
message);
                if ( ret < 0 ) {
                        printf("[thread] ");
                        SP_error(ret);
                        break;
                }

                printf("[thread] received a message\n");
        }

        printf("[thread] listener thread finished\n");

        pthread_exit(0);
}

void connect() {
        mbox = -1;
        int ret = SP_connect("4803 at localhost", "testclient", 0, 0, &mbox, 
privateGroup);
        if ( ret != ACCEPT_SESSION ) {
                SP_error(ret);
                return;
        }

        printf("[main] connected successfully\n");

        pthread_create(&thread, NULL, listen, NULL);
        sched_yield();
}

void disconnect() {
        int ret = SP_disconnect(mbox);
        if ( ret < 0 )
                SP_error( ret );
        printf("[main] disconnected\n");

        printf("[main] waiting for listener thread\n");
        pthread_join(thread, NULL);
}

int main(int argc, char *argv[]) {
        connect();
        disconnect();
        connect();
        disconnect(); // this call does not terminate

        return 0;
}


More information about the Spread-users mailing list