Standard Thread Library

Overview of the concurrency support in C++

Previously, the standard of C++ did not include support the threads, so we can’t write multithreaded applications without extensions that are supplied by particular compiler vendors and APIs for multithreading (e.g. POSIX C standard, Microsoft Windows API and etc.)

Earlier (and of course today, too) developers used set of libraries (like  Microsoft Foundation Class,  Boost , ACE) for the C++ programming language, that provide support for multithreading tasks.

Multithreading support in the new standard

After releasing a new version of language (the C++11 Standard)   has undergone major changes since its birth. For the first time, in the Standard of C++ there was a support of multithreaded applications, i.e. now in the C++ language provides some components in the library for writing multithreaded applications. The C++ Standard Library has been extended to include classes for managing threads (to provide a platform-independent way to manage threads), shared data protection, synchronization between threads, and low level of atomic operations.

So, by using the new standard of C++ is made possible:

  • Writing portable multithreaded code with guaranteed behavior (we can to write multithreaded C++ apps without relying on some extensions )
  • Improving application performance.

The Standard C++ Thread Library

The C++ 11 standard supports multithreading and concurrency both as an inherent part of the memory model, and as part of the C++ Standard Library.  The library has been designed to support the following things:

  • The new memory model
  • Some atomic operations library for direct control over individual bits and bytes. These atomic types and the corresponding operations become more portable and each developer can use it, without the need to adopt platform-specific.
  • Inter-thread synchronization

Steps to create Concurrent program:

  1. Include the <thread> header file(The functions and classes for managing threads are declared in this file)
  2. Add new separate function(initial function), where the new thread of execution begins
    (For the main thread of application, this is main () function, but for every other std::thread will be another function)
  3. Create new std::thread object and pass as a parameter a pointer to function
    (see item 2);
#include <iostream>
#include <thread>

void Thread_Func()
{
   std::cout << "Hello from Thread_Func!!!!!!!!!!\n";
}

int main()
{
    std::thread th1 (Thread_Func);

    return 0;
}

This program starts a new thread to output some text into standard output, therefore the number of threads will be equal to two, i.e. the main thread that starts in the main() function and the new thread that starts in the Thread_Func ().

After the new thread has been started, the main thread continues execution. The main thread will continue until the end of the main() function, so we can get out of the program and finish the created  ‘th1’ thread, even before the new thread will start  to running.

In this connection, after starting the thread, we need make explicit decision:
•    Whether to wait a created thread to completion
OR
•    Leave the thread to run without supervision

We need only make a decision on the fate of the thread before the std::thread object will be destroyed!!!

If we want to wait for the completion of a thread, then we should to call the std::thread::join() function for specific  thread.
For example the previous example, we could implement in the following way:

#include <iostream>
#include <thread>

void Thread_Func()
{
   std::cout << "Hello from Thread_Func!!!!!!!!!!\n";
}

int main()
{
    std::thread th1 (Thread_Func);
    th1.join();

    return 0;
}

This ensures that the th1 thread will be completed execution, before the main () function will be finished (The join() function  blocks the current thread until the thread identified by *this finishes its execution)

As we can see, the function  completed successfully and appears the expected text:thread1

If we want to leave a thread, then we should call detach() immediately after the thread has been started :

#include <iostream>
#include <thread>

void Thread_Func()
{
   std::cout << "Hello from Thread_Func!!!!!!!!!!\n";
}

int main()
{
    std::thread th1 (Thread_Func);
    th1.detach();

    return 0;
}

In this case, the result is very difficult to predict, i.e. for example  may be provided the same output as in the previous example:thread1
but the output may be very different, for example :thread2
It just that case when the main() ended, and the function associated with “th1” could not start…

Daemon thread

After calling detach() function, the std::thread object leaves the thread to run in the background mode, without of communicating with it. Detached threads going run in the background mode; it mean the C   Runtime Library takes ownership of a thread. This library ensures that the resources associated with the thread will be correctly reclaimed when the thread finishes.

If thread (detached thread) passed into the background mode, any more won’t be possible to wait for that the thread was completed. After calling a std::thread::detach() function , the std::thread object is no longer  refer to an actual thread of execution and therefore no longer be  joinable, so a  daemon-thread object can no longer be joined.
In other words, for detached thread, it isn’t possible to obtain a std::thread object that references it, so it can no longer be joined.

One Response to Standard Thread Library

  1. This is great news for c++, now it has a standard Thread Library. I believe more details should be provided as to the synchronization means of std::thread objects. Also a couple of grammar mistakes there at the end really funny.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s