GPT Boss
GPT Boss

Reputation: 27

How to use a thread to break a loop in main c++

I am using the following thread in c++ to check if a certain condition is met and if so then it should break the loop. I call the thread in a while loop so I need that to break. The refresh token is updated by another thread.

void ThreadCheck( void* pParams )
{
  if(refresh)
  {
      continue;
  }
 }

My while loop:-

while(crun)
{
    refresh = false;
    _beginthread( ThreadCheck, 0, NULL );
    rlutil::setColor(8);
    cout<<"Send>> ";
    getline(cin, msg); //Make a custom function of this.
    if(stricmp(msg.c_str(), "exit")==0)
    { 
        crun = false;
    }
    else if(msg.empty() || stricmp(msg.c_str()," ")==0)
    {
       rlutil::setColor(4);
       cout<<"Plz enter a valid message!\n";

       continue;

    } else {
    manager('c', msg);
    // msg.append("\n");
    // chat_out<<msg;
    // chat_out.close();
        }
    cout<<"\n";
}

Upvotes: 1

Views: 1787

Answers (2)

Stathis Andronikos
Stathis Andronikos

Reputation: 1259

You have 2 threads : 1) main, 2) ThreadCheck. Add a mutex so as not to update the 'crun' at the same time and inside the thread update the value to false. That's it

#include <iostream>
#include "/tbb/mutex.h"
#include "/tbb/tbb_thread.h"
using namespace tbb;

typedef mutex myMutex;
static myMutex sm;
int i = 0;

void ThreadCheck( ) 
{ 
      myMutex::scoped_lock lock;//create a lock
      lock.acquire(sm);//Method acquire waits until it can acquire a lock on the mutex
         //***only one thread can access the lines from here...***
        crun = false;;//update is safe (only one thread can execute the code in this scope) because the mutex locked above protects all lines of code until the lock release.
         sleep(1);//simply creating a delay to show that no other thread can update 
         std::cout<<"ThreadCheck "<<"\n";
         //***...to here***

      lock.release();//releases the lock (duh!)      
}

int main()
{
   tbb_thread my_thread(ThreadCheck);//create a thread which executes 'someFunction'

   // ... your code

   my_thread.join();//This command causes the main thread (which is the 'calling-thread' in this case) to wait until thread1 completes its task.

}

Upvotes: 1

David Schwartz
David Schwartz

Reputation: 182761

You cannot modify a value in one thread while another thread is, or might be, accessing it. You need to use some form of synchronization, such as a lock.

Upvotes: 3

Related Questions