codekiddy
codekiddy

Reputation: 6137

multithreading on dual core machine?

I have a dual core processor and according to the explanation I'm able to use only 2 threads but actually I'm able to launch more than 2 threads at same time:

Here is a copy of the explanation:

The static hardware_concurrency() method, provided by the boost::thread class, returns the number of threads that could physically be executed at the same time based on the underlying number of CPUs or CPU cores. Calling this function on a commonly used dual-core machine, a value of 2 is returned. This allows for a simple method to identify the theoretical maximum number of threads that should be used simultaneously by a given multithreaded application.

hardware_concurrency() method returns number 2 in my case, but this program uses 4 threads at same time:

#include <iostream>
#include <boost\thread.hpp>

using namespace std;
using boost::thread;
using namespace boost::this_thread;
using boost::posix_time::seconds;

void f1()
{
    for(int i = 0; i < 10; ++i)
    {
        cout << i << endl;
        sleep(seconds(2));
    }
}

void f2()
{
    for(int i = 0; i < 10; ++i)
    {
        cout << i << endl;
        sleep(seconds(2));
    }
}

int main()
{
    // 4 threads are executed on dual core machine (no problem)
    thread thr1(f1);
    thread thr2(f2);
    thread thr3(f1);
    thread thr4(f2);
    cin.ignore();
    return 0;
}

Can anyone explain that behavior?

Upvotes: 9

Views: 4181

Answers (5)

Jahan Zinedine
Jahan Zinedine

Reputation: 14864

The first called paralell programming and the second one is multi tasking which can be done even in a single processor machine

Upvotes: 1

user529758
user529758

Reputation:

There's a difference between optimal and possible results; there also is a difference between threads phisically and theoretically running at the same time. In a dual-core computer, there are 2 CPUs, that are able to execute two threads phisically at the same time. But the significance of any threading system/thread library is that you are able to create logically as meany threads as you want. These threads won't really run at the same time, they'll be switched over periodically instead to make the illusion as if they were running simoultaneously.

Upvotes: 1

Patrick87
Patrick87

Reputation: 28292

You can use more threads than you have processor cores. This can have several benefits: you can hide communication (e.g., file I/O or network) with computation, or get more processor time in time-slicing systems. With two cores, only two threads will physically be executing at the same time, but having more threads can increase performance. It's something you need to tune.

Upvotes: 1

Tudor
Tudor

Reputation: 62439

The term threads usually covers three abstraction layers:

  1. User threads are threads launched by applications and are mapped N:M to:
  2. Kernel threads, which are threads managed by the operating system, mapped N:M to:
  3. Hardware threads, which are the actual physical resources available.

The 4 threads you said are launched by the application are from category 1 (user threads), while the value 2 returned by that function refers to category 3 (hardware threads). Since the mapping is N:M across the layers, you can see that you can have several user threads mapped to a smaller number of hardware threads.

Having said this, typically starting more than 2x the number of hardware threads if you are doing intensive computations will hurt performance due to context switches and resource contention.

Upvotes: 25

Stephan Dollberg
Stephan Dollberg

Reputation: 34518

You can always run multiple threads, even on single core machine. Though, they can't run in parallel. (more than 2 in your case)

For example, one thread does the GUI, the other fetches some work from the server...

See this for a deeper explanation.

Upvotes: 6

Related Questions