Subject: [boost] asio::ip::tcp::socket and boost::thread
From: xutm (xutom2006_at_[hidden])
Date: 2010-01-06 09:56:27


Hi all,
    I am using 1_39_0 version boost in my application, and encounter two
problems, one with tcp::socket and another with thread. The following is my
codes:

class transStream {
public:
    transStream() {
        cb = NULL;
        thrd = NULL;
    }
    ~transStream() {
        if (sock) {
            sock->close; // would be segment fault
            delete sock; // would be segment fault
        }
        if (thrd) {
            cout << "ready to delete the thread ..." << endl;
            //delete thrd;
            thrd->interrupt(); // actually, the thread still exists and
runs
            thrd->detach();
            cout << "detach the thread ..." << endl;
            thrd = NULL;
        }
        cb = NULL;

        cout << "finish..." << endl;
    }

    tcp::socket* sock;
    TransDataCallBack cb;
    boost::thread* thrd;
};

static void getDataThread(transStream* ts)
{
    if (!ts) {
        return ;
    }

    cout << "in getDataThread method ...." << endl;

    try {
        boost::system::error_code error;
        char packet[PACKET_LENGTH] = {0};
        memset(packet, 0, PACKET_LENGTH);

        for (;;) {
            ...
            usleep(10);
        }

        cout << " exit the for loop " << endl;
    }
    catch(std::exception& e) {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    if (ts) delete ts;

    return ;
}

int CreateTransStream(OUT void** pTsHandle, IN const char* sTransIp,
    IN unsigned short servTransPort, IN const CONVERT_STREAM_INFO* pInfo)
{

    if (!sTransIp || !pInfo) {
        cout << "error parameters" << endl;
        return -1;
    }
    stringstream ss;
    string port;

    transStream* ts = new transStream();

    ...

    ts->sock = sock;
    *pTsHandle = ts;

    cout << "finish sending the dahua device info to server and return ..."
<< endl;

    return 0;
}

int StartTransStream(IN void* tsHandle, IN TransDataCallBack cb, IN void*
userData)
{
    stringstream ss;
    transStream* ts = (transStream*)tsHandle;

    if (!tsHandle || !ts) {
        return -1;
    }
    ...

    ts->cb = cb;
    boost::thread* thrd = new boost::thread(boost::bind(getDataThread, ts));
    ts->thrd = thrd;

    ...

    return 0;
}

int StopTransStream(IN void* tsHandle)
{

    transStream* ts = (transStream*)tsHandle;

    if (!tsHandle || !ts) {
        return -1;
    }
    ...

    return 0;
}

int DestroyTransStream(IN void* tsHandle)
{
    transStream* ts = (transStream*)tsHandle;

    if (!tsHandle || !ts) {
        return -1;
    }

    cout << "in method DestroyTransStream ..." << endl;

    if (ts->thrd) {
        cout << "destory the thread ..." << endl;
        if (ts) {
            delete ts;
            cout << "reset ..." << endl;
            ts = NULL;
        }
    }

    cout << "deleted the socket ..." << endl;

    return 0;
}

1. the first problem: in the function CreateTransStream, i declare a
transStream using "transStream* ts = new transStream();" and a socket using
"tcp::socket* sock = new tcp::socket(io_service);", "ts->sock = sock;" ,
then i return the ts using "*pTsHandle = ts;" ; When i delete the ts in the
function DestroyTransStream: "delete ts;", i know the system would call the
deconstruct function ~transStream(), when i call sock->close() or delete
sock, Segment Fault will occurs. Can somebody tell me why? Or how can i
solve the problem?
2. the second problem: If i want to kill a thread which is no longer useful,
I think i just need to call the two lines: " thrd->interrupt();" and "
thrd->detach();" . But actully, the two lines cannot kill the thread. Can
somebody tell me how to do? Thinks in advances!