Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: ammaximus от Июль 06, 2015, 10:29



Название: QSharedMemory указатели
Отправлено: ammaximus от Июль 06, 2015, 10:29
Работаю с QSharedMemory. Если создавать ее экземпляры в разных проектах, то указатель на данные один и тот же. Но если в одном проекте создать несколько копий, то указатели разные, хотя все работает! В чем дело?

Код:
#include <QApplication>
#include <QWidget>
#include <QSharedMemory>
#include <iostream>
class A{
    public:
    A() :mem("testmem")
    {
        if (!mem.create(sizeof(int))){
        std::cout << "FTimeAttach: " << mem.attach() << std::endl;
        }
else{
    std::cout << "FTimeCreate!, SET ONLY HERE" << std::endl;
    set(7);
        }
    }
   
    QSharedMemory mem;
   
    void  set(int i){
*(int*)mem.data() = i;
    }
    void print(){
std::cout << mem.data() << std::endl;
std::cout << *(int*)mem.data() << std::endl;
    }

};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    A a;
    a.print();
   
    A b;
    b.print();
    b.set(45);
   
    A c;
    c.print();
   
    std::cout << "again" << std::endl;
    a.print();
   
    std::cout << "EBDL:" << a.mem.data() << std::endl; // Different
    std::cout << "EBDL:" << b.mem.data() << std::endl; // Pointers
    std::cout << "EBDL:" << c.mem.data() << std::endl; // Each time

    return app.exec();
}

Результат работы:
Код:
FTimeAttach: 1
0x2b92c000
45
FTimeAttach: 1
0x2bf5f000
45
FTimeAttach: 1
0x2bf60000
45
again
0x2b92c000
45
EBDL:0x2b92c000
EBDL:0x2bf5f000
EBDL:0x2bf60000

Бывало, что замечал разные указатели и в разных проектах. Что это и как это работает?


Название: Re: QSharedMemory указатели
Отправлено: Igors от Июль 06, 2015, 10:51
Каждый QSharedMemory мапит в свой "логический адрес", вот и все. Вы же не удивляетесь что когда один экземпляр удален остальные работают, они независимы друг от друга. Хотя могут юзать физически одну память - это неск мапов, а не один шареный.

И напрасно Вы продолжаете болтить lock(), потом огребете на отладке - мало не покажется.