Alguém pode postar um exemplo simples de iniciar dois threads (orientados a objetos) em C ++.
Estou procurando objetos de thread C ++ reais nos quais eu possa estender os métodos de execução (ou algo semelhante), em vez de chamar uma biblioteca de threads no estilo C.
Eu deixei de fora quaisquer solicitações específicas do SO na esperança de que quem respondesse respondesse com bibliotecas de plataforma cruzada para usar. Só estou deixando isso explícito agora.
c++
multithreading
Zak
fonte
fonte
Respostas:
Crie uma função que você deseja que o thread execute, por exemplo:
Agora crie o
thread
objeto que finalmente chamará a função acima da seguinte maneira:(Você precisa
#include <thread>
acessar astd::thread
classe)Os argumentos do construtor são a função que o thread executará, seguido pelos parâmetros da função. O encadeamento é iniciado automaticamente na construção.
Se, mais tarde, você desejar aguardar o término da execução da função, chame:
(Associação significa que o encadeamento que chamou o novo encadeamento aguardará a conclusão do novo encadeamento antes de continuar sua própria execução).
O código
Mais informações sobre std :: thread aqui
-std=c++0x -pthread
.fonte
-std=c++0x
(em vez de-std=c++0x
)" Eu acredito que o segundo "c ++ 0x" deveria ser "c ++ 11", mas não é possível alterar porque a edição é muito pequena.task1
. Portanto, o ponteiro da função também é indicado portask1
. Mas obrigado por trazer isso à tona, porque eu acredito que estava errado e é equivalente a&task1
, por isso não importa qual formulário você escolher escrever (se sim, acho que o ponteiro para o ponteiro da função é&&task1
- isso seria ruim ) Pergunta relevante .Bem, tecnicamente, qualquer objeto desse tipo acabará sendo construído sobre uma biblioteca de encadeamentos no estilo C, porque o C ++ apenas especificou um
std::thread
modelo de estoque em c ++ 0x, que foi pregado e ainda não foi implementado. O problema é um pouco sistêmico, tecnicamente o modelo de memória c ++ existente não é estrito o suficiente para permitir uma semântica bem definida para todos os casos 'acontecem antes'. Hans Boehm escreveu um artigo sobre o assunto há algum tempo e foi fundamental para elaborar o padrão c ++ 0x sobre o assunto.http://www.hpl.hp.com/techreports/2004/HPL-2004-209.html
Dito isto, existem várias bibliotecas C ++ de segmento de plataforma cruzada que funcionam bem na prática. Os blocos de construção de encadeamentos Intel contêm um objeto tbb :: thread que se aproxima do padrão c ++ 0x e o Boost possui uma biblioteca boost :: thread que faz o mesmo.
http://www.threadingbuildingblocks.org/
http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html
Usando boost :: thread, você obterá algo como:
fonte
Há também uma biblioteca POSIX para sistemas operacionais POSIX. Verifique a compatibilidade
compile com -lpthread
http://en.wikipedia.org/wiki/POSIX_Threads
fonte
fonte
Ao procurar um exemplo de uma classe C ++ que chame um de seus próprios métodos de instância em um novo encadeamento, essa pergunta surge, mas não conseguimos usar nenhuma dessas respostas dessa maneira. Aqui está um exemplo que faz isso:
Class.h
Class.cpp
Observe que este exemplo não entra em mutex ou bloqueio.
fonte
A menos que alguém queira uma função separada em namespacs globais, podemos usar funções lambda para criar threads.
Uma das principais vantagens da criação de encadeamento usando lambda é que não precisamos passar parâmetros locais como uma lista de argumentos. Podemos usar a lista de capturas para o mesmo e a propriedade de fechamento do lambda cuidará do ciclo de vida.
Aqui está um código de exemplo
De longe, eu achei as lambdas C ++ a melhor maneira de criar threads, especialmente para funções mais simples de threads
fonte
Depende em grande parte da biblioteca que você decide usar. Por exemplo, se você usar a biblioteca wxWidgets, a criação de um thread ficaria assim:
Se o seu thread principal chamar o método CreateThread, você criará um novo thread que começará a executar o código no seu método "Entry". Na maioria dos casos, você precisará manter uma referência ao encadeamento para ingressar ou pará-lo. Mais informações aqui: documentação wxThread
fonte