LINUX.ORG.RU

Есть особенности. Например, в pthreads есть механизм кооперативного завершения нити pthread_cancel, который вызывает зарегистрированные обработчики, а деструкторы - нет.

dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

Еще такой вопрос в догонку: помимо pthreads есть другие либы предоставляющие многопоточность, например openmp и QtThreads, каково их предназначение, кроссплатформенность?

savgur
() автор топика
Ответ на: комментарий от dmitry_vk

pthread_cleanup и ей подобные - это ССЗБ. Нормальные люди таким не пользуются, а просто заводят переменную isCanceled и выходят из поточной функции в нужный момент

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

>pthread_cleanup и ей подобные - это ССЗБ. Нормальные люди таким не пользуются, а просто заводят переменную isCanceled и выходят из поточной функции в нужный момент.

Когда как. Когда-то это бывает полезно. Когда-то нет. В большинстве случаев не стоит использовать pthread_cancel, но есть ряд случаев, когда без этого никуда.

dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

А когда никуда? Просто интерестно такой use case найти

vertexua ★★★★★
()

Надо быть ОЧЕНЬ внимательным при обработке исключений. Необработанное исключение в потоке это ужас на крыльях ночи...

the_coder ★★
()
Ответ на: комментарий от dmitry_vk

который вызывает зарегистрированные обработчики, а деструкторы - нет.

#include <iostream>
#include <pthread.h>
using namespace std;

class A
{
        int id;
public:
        A(int _id): id(_id) { cout << "\nA::A(" << id << ")" << endl; }
        ~A() { cout << "\nA::~A(" << id << ")" << endl; }
};

void* foo(void*)
{
        A a(1);

        cout << "thread sleep..." << endl;
        sleep(5);

        cout << "never here" << endl;
        abort();

        return NULL;
}

int main()
{
        pthread_t tid;

        pthread_create(&tid, NULL, foo, NULL);
        sleep(1);

        cout << "cancel thread sleep" << endl;
        pthread_cancel(tid);

        pthread_join(tid, NULL);

        return 0;
}

$ g++ -W -Wall -Wextra -pedantic -std=gnu++0x a.cxx -lpthread
$ ./a.out 

A::A(1)
thread sleep...
cancel thread sleep

A::~A(1)

Вопрос на засыпку: а почему у меня — вызывается деструктор? :)

Eshkin_kot ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.