Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running two threads at the same time

I want to know if a program can run two threads at the same time (that is basically what it is used for correct?). But if I were to do a system call in one function where it runs on thread A, and have some other tasks running in another function where it runs on thread B, would they both be able to run at the same time or would my second function wait until the system call finishes?

Add-on to my original question: Now would this process still be an uninterruptable process while the system call is going on? I am talking about using any system call on UNIX/LINUX.

like image 536
user2644819 Avatar asked Oct 11 '13 17:10

user2644819


People also ask

Can 2 threads run at the same time?

In the same multithreaded process in a shared-memory multiprocessor environment, each thread in the process can run concurrently on a separate processor, resulting in parallel execution, which is true simultaneous execution.

Can a CPU run multiple threads simultaneously?

In summary, multiple threads on a single CPU core can be executed concurrently. Multiple threads on multiple CPU cores can be executed concurrently or in parallel.


6 Answers

Multi-threading and parallel processing are two completely different topics, each worthy of its own conversation, but for the sake of introduction...

Threading:
When you launch an executable, it is running in a thread within a process. When you launch another thread, call it thread 2, you now have 2 separately running execution chains (threads) within the same process. On a single core microprocessor (uP), it is possible to run multiple threads, but not in parallel. Although conceptually the threads are often said to run at the same time, they are actually running consecutively in time slices allocated and controlled by the operating system. These slices are interleaved with each other. So, the execution steps of thread 1 do not actually happen at the same time as the execution steps of thread 2. These behaviors generally extend to as many threads as you create, i.e. packets of execution chains all working within the same process and sharing time slices doled out by the operating system.

So, in your system call example, it really depends on what the system call is as to whether or not it would finish before allowing the execution steps of the other thread to proceed. Several factors play into what will happen: Is it a blocking call? Does one thread have more priority than the other. What is the duration of the time slices?

Links relevant to threading in C:
SO Example
POSIX
ANSI C

Parallel Processing:
When multi-threaded program execution occurs on a multiple core system (multiple uP, or multiple multi-core uP) threads can run concurrently, or in parallel as different threads may be split off to separate cores to share the workload. This is one example of parallel processing.

Again, conceptually, parallel processing and threading are thought to be similar in that they allow things to be done simultaneously. But that is concept only, they are really very different, in both target application and technique. Where threading is useful as a way to identify and split out an entire task within a process (eg, a TCP/IP server may launch a worker thread when a new connection is requested, then connects, and maintains that connection as long as it remains), parallel processing is typically used to send smaller components of the same task (eg. a complex set of computations that can be performed independently in separate locations) off to separate resources (cores, or uPs) to be completed simultaneously. This is where multiple core processors really make a difference. But parallel processing also takes advantage of multiple systems, popular in areas such as genetics and MMORPG gaming.

Links relevant to parallel processing in C:
OpenMP
More OpenMP (examples)
Gribble Labs - Introduction to OpenMP
CUDA Tookit from NVIDIA

Additional reading on the general topic of threading and architecture:

This summary of threading and architecture barely scratches the surface. There are many parts to the the topic. Books to address them would fill a small library, and there are thousands of links. Not surprisingly within the broader topic some concepts do not seem to follow reason. For example, it is not a given that simply having more cores will result in faster multi-threaded programs.

like image 84
ryyker Avatar answered Oct 05 '22 10:10

ryyker


Yes, they would, at least potentially, run "at the same time", that's exactly what threads are for; of course there are many details, for example:

  • If both threads run system calls that e.g. write to the same file descriptor they might temporarily block each other.

  • If thread synchronisation primitives like mutexes are used then the parallel execution will be blocked.

  • You need a processor with at least two cores in order to have two threads truly run at the same time.

It's a very large and very complex subject.

like image 21
Seg Fault Avatar answered Oct 05 '22 12:10

Seg Fault


  • If your computer has only a single CPU, you should know, how it can execute more than one thread at the same time.

  • In single-processor systems, only a single thread of execution occurs at a given instant. because Single-processor systems support logical concurrency, not physical concurrency.

  • On multiprocessor systems, several threads do, in fact, execute at the same time, and physical concurrency is achieved.

  • The important feature of multithreaded programs is that they support logical concurrency, not whether physical concurrency is actually achieved.

like image 27
Khaula Fathima Avatar answered Oct 05 '22 12:10

Khaula Fathima


The basics are simple, but the details get complex real quickly.

You can break a program into multiple threads (if it makes sense to do so), and each thread will run "at its own pace", such that if one must wait for, eg, some file I/O that doesn't slow down the others.

On a single processor multiple threads are accommodated by "time slicing" the processor somehow -- either on a simple clock basis or by letting one thread run until it must wait (eg, for I/O) and then "switching" to the next thread. There is a whole art/science to doing this for maximum efficiency.

On a multi-processor (such as most modern PCs which have from 2 to 8 "cores") each thread is assigned to a separate processor, and if there are not enough processors then they are shared as in the single processor case.

The whole area of assuring "atomicity" of operations by a single thread, and assuring that threads don't somehow interfere with each other is incredibly complex. In general a there is a "kernel" or "nucleus" category of system call that will not be interrupted by another thread, but thats only a small subset of all system calls, and you have to consult the OS documentation to know which category a particular system call falls into.

like image 31
Hot Licks Avatar answered Oct 05 '22 11:10

Hot Licks


They will run at the same time, for one thread is independent from another, even if you perform a system call.

It's pretty easy to test it though, you can create one thread that prints something to the console output and perform a system call at another thread, that you know will take some reasonable amount of time. You will notice that the messages will continue to be printed by the other thread.

like image 41
fvdalcin Avatar answered Oct 05 '22 12:10

fvdalcin


Yes, A program can run two threads at the same time.

it is called Multi threading.

would they both be able to run at the same time or would my second function wait until the system call finishes?

They both are able to run at the same time.


if you want, you can make thread B wait until Thread A completes or reverse

like image 22
Gangadhar Avatar answered Oct 05 '22 11:10

Gangadhar