Возврат из потока POSIX

109
22 января 2020, 00:40

Нужно вернуть данные из потоковой функции:

void* func(void*){
   int* res=new int(10);
   return (void*)res; //pthread_exit((void*)res) тоже не помогает
}
int main() {
    pthread_t tid;
    pthread_create(&tid,0,func,0);
    void** res=0;
    pthread_join(tid,res);
    int** a=(int**)res;
    cout<<**a<<endl;
}

Получаю ошибку на этапе выполнения

Answer 1

2-й аргумент pthread_join - это адрес, куда будет положен указатель (void*), возвращенный из потока. Вы передаете в NULL, в качестве такого адреса, и естественно получаете ошибку. Решение:

void* res=0;
pthread_join(tid,&res);
int* a=(int*)res;
cout<<*a<<endl;
Answer 2

Имеет смысл сразу при создании передавать в поток указатель на переменную, в которую поток должен будет сохранить результат:

#include <pthread.h>
#include <iostream>
#include <new>
#include <memory>
#include <cstdlib>
void * func(void * param) noexcept
{
    auto const pp_int{static_cast<int * *>(param)};
    (*pp_int) = new (::std::nothrow) int{10};
    return nullptr;
}
int main()
{
    int * p_int{};
    ::pthread_t thread_handle{};
    auto const create_result
    {
        ::pthread_create
        (
            ::std::addressof(thread_handle)
        ,   nullptr
        ,   func
        ,   static_cast<void *>(::std::addressof(p_int))
        )
    };
    if(0 == create_result)
    {
        auto const join_result{::pthread_join(thread_handle, nullptr)};
        if(0 != join_result)
        {
            ::std::abort();
        }
        if(nullptr != p_int)
        {
            ::std::cout << (*p_int) << ::std::endl;
            delete p_int;
            p_int = nullptr;
        }
    }  
    return 0;
}
READ ALSO
Как рендерить svg в gtkmm3, cairomm?

Как рендерить svg в gtkmm3, cairomm?

В C можно рендерить svg в cairo с помощю librsvg, чем рендерить svg в gtkmm? cairomm? или как засунуть в cairomm GdkPixbuf*?

114
Проверка подключения к MySQL (Java)

Проверка подключения к MySQL (Java)

Занимаюсь разработкой собственной мини-утилиты для работы с MySQLКак я могу проверить подключение к указанному хосту (по логину и паролю) без...

118
Подзапрос на java к таблице

Подзапрос на java к таблице

Всем приветПодскажите как написать подзапрос по выборке из таблицы?

121
После добавления maven в текущий проект не запускает java класс

После добавления maven в текущий проект не запускает java класс

До добавления maven у меня был один java class Main, после добавления его местоположение было в srcmaven создал структуру проекта и на сколько я понимаю...

136