Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does my thread not run in background?

In the listing bellow, I expect that as I call t.detach() right after the line when the thread is created, the thread t will run in background while the printf("quit the main function now \n") will called and thenmain will exit.

#include <thread>
#include <iostream>

void hello3(int* i)
{

    for (int j = 0; j < 100; j++)
    {
        *i = *i + 1;
        printf("From new thread %d \n", *i);
        fflush(stdout);

    }

    char c = getchar();
 }

int main()
{
    int i;
    i = 0;
    std::thread t(hello3, &i);
    t.detach();
    printf("quit the main function now \n");
    fflush(stdout);
    return 0;
}

However from what it prints out on the screen it is not the case. It prints

From new thread 1
From new thread 2
....
From new thread 99
quit the main function now.

It looks like the main function waits until the thread finishes before it executes the commandprintf("quit the main function now \n"); and exits.

Can you please explain why it is? What I am missing here?

like image 816
rudky Avatar asked Aug 15 '17 20:08

rudky


People also ask

What happens when a thread is blocked by the OS?

Since the thread is blocked, the OS can't call onDraw (), and your app freezes, potentially leading to an Application Not Responding (ANR) dialog. Instead, let's run this operation on a background thread.

Is the callback thread a background thread?

In this example, the callback is executed in the calling thread, which is a background thread. This means that you cannot modify or communicate directly with the UI layer until you switch back to the main thread. Note: To communicate with the View from the ViewModel layer, use LiveData as recommended in the Guide to app architecture.

What are some examples of threading in Android?

For example, if your app makes a network request from the main thread, your app's UI is frozen until it receives the network response. You can create additional background threads to handle long-running operations while the main thread continues to handle UI updates.

How to move the execution of loginrepository to a background thread?

We can use the thread pool that we've instantiated to move the execution to a background thread. First, following the principles of dependency injection , LoginRepository takes an instance of Executor as opposed to ExecutorService because it's executing code and not managing threads:


2 Answers

The problem is that your thread is too fast.

It's able to print all 100 strings before main gets a chance to continue.

Try making the thread slower and you'll see the main printf before that of the thread.

like image 72
6502 Avatar answered Oct 06 '22 00:10

6502


It happens, based on your OS scheduling. Moreover the speed of your thread affects the output too. If you stall the thread (change 100 to 500 for example), you will see the message first.

I just executed the code and the "quit the main function now." message appeared first, like this:

quit the main function now 
From new thread 1 
From new thread 2 
From new thread 3 
From new thread 4 
...

You are right about detach:

Detaches the thread represented by the object from the calling thread, allowing them to execute independently from each other.

but this does not guarantee that the message "quit the main function now" will appear first, although it's very likely.

like image 21
gsamaras Avatar answered Oct 05 '22 23:10

gsamaras