Re[19]: Visual C# vs C++. Надо сравнить перспективы.
От: alex_public  
Дата: 09.01.17 15:13
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>PostMessage он не только в винде — это распространенный механизм, и очень полезный, т.к. упрощает синхронизацию и исключает большинство deadlockов при обмене данными между потоками.


Если ты подразумеваешь под PostMessage самую идею, а не реализацию, то это по сути и есть некая разновидность модели акторов. ))) А вот реализации могут быть очень разные. Можно попробовать использовать в этой роли системную очередь сообщений винды, но это далеко не самый стабильный и эффективный путь. А вот если взять что-то вроде такого http://actor-framework.org решение, то всё будет гораздо веселее. )

lpd>Но в данном случае достаточно просто передать в конструктор std::thread указатель, и после этого поиспользовать и затем забыть про него в основном потоке, как-то синхронизируясь, а с локальными объектами этого сделать нельзя.


Эээ что? ) Вот такой простейший пример кода:
struct Test{
    string data;
    Test(const string& s): data(s) {cout<<this_thread::get_id()<<" constructor: "<<data<<endl;}
    Test(const Test& t) {data=t.data; cout<<this_thread::get_id()<<" copy constructor: "<<data<<endl;}
    Test(Test&& t) {data=move(t.data); cout<<this_thread::get_id()<<" move constructor: "<<data<<endl;}
    ~Test() {cout<<this_thread::get_id()<<" destructor: "<<data<<endl;}
    void print() {cout<<this_thread::get_id()<<" print: "<<data<<endl;}
};
int main()
{
    thread second, third;
    second=thread([&]{
        Test test("hello world");
        test.print();
        third=thread([&](Test&& t){
            second.join();//ждём завершения родительского потока, чтобы всё было по честному (было ясно, что данные берутся не из его стека)
            t.print();
        }, move(test));
    });
    second.join();
    third.join();
}

Выдаёт такой результат:
2 constructor: hello world
2 print: hello world
2 move constructor: hello world
2 move constructor: hello world
2 destructor:
2 destructor:
3 print: hello world
3 destructor: hello world


lpd>Вообщем, можно спорить относительно полезности семантики. Очевидно, что это большое нововведение, меняющее язык, и я уже встречал вакансии где менеджеры(или тех лиды) пишут требованием C++14. На мой взгляд, это все равно что требовать от C++ программиста знания perl, lisp, erlang, rust или еще какого-то редкого языка, который, без сомнения, может чем-то улучшить программу. И это делается массово. Я, например, не увлекаюсь языками программирования — C++ это для меня только инструмент, а специализации у меня другие. И _необходимости_ использовать C++11-14 в программе нет. Это всего лишь дополнение к языку, к которому у разных людей разное отношение.


Конечно. C++ в общем то тем и хорош, что позволяет работать в любом стиле. Хоть в стиле чистого древнего C пиши и всё будет отлично работать. Но я бы всё же посоветовал изучить и применять современный C++, потому как он позволяет переложить значительную часть работы на плечи компилятора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.