Подскажите пожалуйста сишнику 90х как понимать такую запись:
#include <boost/thread.hpp>
void function()
{
myObj server;
...
thread server_thread( [&server]()
{
server.start();
});
...
}
и как это в нормальный вид переписать?
Здравствуйте, emergenter, Вы писали:
Это лямбда-функция была, можно избавиться
#include <thread>
void ThreadFunc(myObj& server)
{
server.start();
}
void function()
{
myObj server;
...
std::thread server_thread = std::thread( ThreadFunc, server );
...
}
Так? Или нужно совсем бес C++11?
Здравствуйте, emergenter, Вы писали:
E>Подскажите пожалуйста сишнику 90х как понимать такую запись:
E>
E>#include <boost/thread.hpp>
E>void function()
E>{
E> myObj server;
E>...
E> thread server_thread( [&server]()
E> {
E> server.start();
E> });
E>...
E>}
E>и как это в нормальный вид переписать?
E>
В С++'03 это выглядело бы как-то так:
void function()
{
myObj server;
// ----------------------------------
class Fufel
{
public:
Fufel(myObj& m) : m_srv(m) {}
void operator()()
{
m_srv.start();
}
private:
myObj& m_srv;
}
// ----------------------------------
...
thread server_thread( Fufel(server) );
...
}
А в Си с классами:
static myObj* pUniqueFufelServer = NULL;
static void thread_func()
{
pUniqueFufelServer->start();
}
void function()
{
myObj server;
...
pUniqueFufelServer = &server;
thread server_thread( thread_func );
...
}
Только не приведи аллах вызывать такую функцию из нескольких потоков.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Только не приведи аллах вызывать такую функцию из нескольких потоков.
Да оригинальный код тоже не фонтан. Сервер по ссылке захватывается. Надеюсь, join в той же функции.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>А в Си с классами:
SVZ>SVZ>static myObj* pUniqueFufelServer = NULL;
SVZ>static void thread_func()
SVZ>{
SVZ> pUniqueFufelServer->start();
SVZ>}
SVZ>void function()
SVZ>{
SVZ> myObj server;
SVZ>...
SVZ> pUniqueFufelServer = &server;
SVZ> thread server_thread( thread_func );
SVZ>...
SVZ>}
SVZ>
SVZ>Только не приведи аллах вызывать такую функцию из нескольких потоков.
Ничего страшного, если использование static заменить на любой вариант TLS (например "__declspec (thread)", "pthread_getspecific", "thread_local").