C++0x, thread, promise and future

Jonathan Wakely jwakely.gcc@gmail.com
Sat Jul 16 11:12:00 GMT 2011


On 16 July 2011 08:00, Claudio La Rosa wrote:
>
> Hello!
>
> I am making a simple template class for communication with two thread in
> C++0x, using the promise and future.
> My class make a channel to communicate thread with the main program and
> another channel to allow the child thread to initiate communication with the
> parent thread (or main program).
>
> This is the code:
>
>
> #include <iostream>
> #include <future>
> #include <thread>
>
> using namespace std;
>
> template<typename T = std::string,typename T1 = std::string>
> class ThreadChannel
> {
>    private:
>     std::promise<T> ch1_Promise;
>     std::future<T>  ch1_Future;
>
>     std::promise<T1> ch2_Promise;
>     std::future<T1>  ch2_Future;
>
>    public:
>        ThreadChannel();
>        virtual ~ThreadChannel();
>
>         T1 recvFromFather(void);
>         void sendToChild(T1);
>         //canale 1
>         void sendToFather(T);
>         T recvFromChild(void);
>
> };
>
>
> //
> template<typename T,typename T1>
> ThreadChannel<T,T1>::ThreadChannel()
> {
>  ch1_Future = ch1_Promise.get_future();
>  ch2_Future = ch2_Promise.get_future();
> }
>
> template<typename T,typename T1>
> ThreadChannel<T,T1>::~ThreadChannel()
> {
>  //cout<<"Sono nel distruttore!!"<<endl;
> }
>
> template<typename T,typename T1>
> T ThreadChannel<T,T1>::recvFromChild()
> {
>  return ch1_Future.get();
> }
>
> template<typename T,typename T1>
> void ThreadChannel<T,T1>::sendToFather(T data)
> {
>  return ch1_Promise.set_value(data);
> }
>
> template<typename T,typename T1>
> void ThreadChannel<T,T1>::sendToChild(T1 data)
> {
>  return ch2_Promise.set_value(data);
> }
>
> template<typename T,typename T1>
> T1 ThreadChannel<T,T1>::recvFromFather()
> {
>  return ch2_Future.get();
> }
>
>
> void myAsyncFun(ThreadChannel<int,int>* ch)
> {
>    while(1)
>    {
>     int r = ch->recvFromFather();
>     ch->sendToFather(++r);
>    }
> }
>
> int main()
> {
>    ThreadChannel<int,int>* myChannel=new ThreadChannel<int,int>();
>    // thread
>    std::thread* t = new std::thread(myAsyncFun,myChannel);
>    int myVar = 33;
>    myChannel->sendToChild(myVar);
>    int resp = myChannel->recvFromChild();
>    cout<<"Response from thread: "<<resp<<endl;
>
>
>    t->join();
>    delete myChannel;
>
>    return 0;
> }
>
> The first time the while loop executes (in myAsyncFun), it works well.
> but the second time, when for the second time the statement is executed:
>
> int r = ch-> recvFromFather ();
>
> I have a segmentation fault.

Are you sure you get a segfault?  You should get an exception in the
myAsyncFun thread, which is not caught so the program calls
std::teminate

You can't use a promise more than once, so your loop will always fail
on the second iteration.

Also, as matters of style, you don't need to create the std::thread
using 'new' but if you do then you should delete it.



More information about the Gcc-help mailing list