crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Потокобезопасность сокетного обмена, проблема с пониманием QMutex
mezmay
  опции профиля:
сообщение 3.2.2011, 11:20
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Есть класс - сокет-клиент:
файл cmysocketclient.h
#ifndef CMYSOCKETCLIENT_H
#define CMYSOCKETCLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include <QString>
#include <QMutexLocker>

class CMySocketClient : public QObject
{
    Q_OBJECT

public:
    CMySocketClient(void);
    CMySocketClient(const QString &hostAddr, const int &nPort);
    ~CMySocketClient(void);

    bool connectToServer(const QString &hostAddr, const int &nPort, const int &nWait = 100);
    void disconnect();
    int send(const void *data, const int &bytesSize);
    int receive(void *data, const int &maxSize);

protected:    
    QTcpSocket *server;
              QMutex      m_mutex;

protected slots:
    virtual void onConnect();
    virtual void onReceive();
    virtual void onDisconnect();
    virtual void onError();
};

#endif // CMYSOCKETCLIENT_H

файл cmysocketclient.cpp:
#include "cmysocketclient.h"

CMySocketClient::CMySocketClient(void)    
{
    QMutexLocker locker(&m_mutex);

    server = new QTcpSocket();

    connect( server, SIGNAL(connected()), this, SLOT(onConnect()) );
    connect( server, SIGNAL(readyRead()), this, SLOT(onReceive()) );
    connect( server, SIGNAL(disconnected()), this, SLOT(onDisconnect()) );
    connect( server, SIGNAL(error ( QAbstractSocket::SocketError )), this, SLOT(onError()));
}

CMySocketClient::CMySocketClient(const QString &hostAddr,  const int &nPort)
{
              QMutexLocker locker(&m_mutex);

    server = new QTcpSocket();
    
    connectToServer(hostAddr, nPort);    

    connect( server, SIGNAL(connected()), this, SLOT(onConnect()) );
    connect( server, SIGNAL(readyRead()), this, SLOT(onReceive()) );
    connect( server, SIGNAL(disconnected()), this, SLOT(onDisconnect()) );
    connect( server, SIGNAL(error ( QAbstractSocket::SocketError )), this, SLOT(onError()));
}

CMySocketClient::~CMySocketClient()
{
              QMutexLocker locker(&m_mutex);

    delete server;    
}

bool CMySocketClient::connectToServer( const QString &hostAddr, const int &nPort, const int &nWait /*= 100*/ )
{
    QMutexLocker locker(&m_mutex);

    server->connectToHost(hostAddr, nPort);
    if(!server->waitForConnected(nWait))
    {
        return false;
    }
    else
        return true;
}

void CMySocketClient::disconnect()
{
    QMutexLocker locker(&m_mutex);

    server->disconnectFromHost();
    server->waitForDisconnected();
}

void CMySocketClient::onConnect()
{

}

void CMySocketClient::onReceive()
{

}

void CMySocketClient::onDisconnect()
{
    
}

void CMySocketClient::onError()
{

}

int CMySocketClient::send( const void *data, const int &bytesSize )
{
    QMutexLocker locker(&m_mutex);

    return server->write((const char *)data, bytesSize);
}

int CMySocketClient::receive( void *data, const int &maxSize )
{
    QMutexLocker locker(&m_mutex);

    return server->read((char *)data, maxSize);
}


Наследую от этого класса еще один класс - класс управления устройством, называется CBaseMupo. В нем просто вызываю функции connectToServer, disconnect, send, receive. В двух разных потоках создаю экземляры класса CBaseMupo. Работаю с обоими экземплярами в обоих потоках одновременно (оба экземпляра подключаются к одному и тому же ip-адресу и порту). В результате получаю ошибки обмена (приема\получения данных). Вопрос - почему? Ведь мой класс CMySocketClient вроде бы потокобезопасный? Или дело в том что я использую разные экземпляры класса? Получается что QMutex обеспечивает потокобезопасность только если из разных потоков обращаться к ОДНОМУ объекту, а в противном случае атомарность не обеспечивается?...

М
Оборачивайте длинный код в тэг expand.
Справка по кнопкам и тэгам форума
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 3.2.2011, 11:50
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Дополнение: обмен глючит даже если объект одного потока обращается к одному IP и порту, а объект второго потока - к другим IP и порту...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 1:39