Hacker News new | past | comments | ask | show | jobs | submit login

What's the real reason for using threads today ? Why not use multi-process instead ? Or even OpenCL/CUDA if one needs to crunch numbers ?

The only real use-case for thread I can see right now, is for large game engine that need to process sound, graphics, networking, and inputs, all at the same time. What other type of application does need to make use of threads ?




In some application domains, the program conceptually operates on a big shared data structure. The usual example applications are mesh triangulation and mesh refinement [1].

For these kind of algorithms, it is not possible to divide work up into isolated jobs that can be run entirely independently of others, as until we start solving something like a refinement problem, we don't know what parts of the graph we will need.

That rules out OpenCL and CUDA, as they want to take a job and run it to completion without having to worry about what anyone else is doing.

It also makes multi-processes less attractive. If you have isolated processes and just pass messages between them, then you have the same problem. Do you have one process that handles the shared data structure? Well then you've effectively serialised your program. Do you divide up the data structure between processes? I wouldn't know how to do that as operations may span the partitions.

Perhaps you'll use shared memory between the processes? Well then you're effectively writing multi-threaded code and you might as well use threads.

In the end the easiest way to do things that we know of is to use multiple threads, shared memory, synchronisation primitives and optimistic algorithms.

[1] K. Pingali, D. Nguyen, M. Kulkarni, M. Burtscher, M. A. Hassaan, R. Kaleem, T.-H. Lee, A. Lenharth, R. Manevich, M. M. ndez-Lojo, D. Prountzos, and X. Sui, “The Tao of Parallelism in Algorithms,” presented at the Proceedings of the 32nd Conference on Programming Language Design and Implementation (PLDI), 2011.


Thank you for being a voice of sanity on this Chris.

There seems to be a terrible amount of cargo culting around safe concurrent programming and the reinvention of the wheel just because somebody heard the original wheel was bad (c.f. Processes and shared memory vs. threads), and the hope that CSP and similar schemes will act as a magik bullet.

In the end you need to think carefully about the design of your program, work out what races might occur, and try encapsulate any shared state mutation in as small an area as possible where it can be sensibly reasoned about. Remember that using concurrent data structures will not automatically make your code safe, put in comments saying why any shortcut you take is safe, and do really thorough code review.


> What's the real reason for using threads today?

Hahaha, good one ... oh, wait. Are you serious?

The real reasons are the same as they were, including separation of GUI and non-GUI processing in desktop apps, dispersal of bulk work (both computational and operational) across several cores, wrapping of blocking calls to make them asynchronous/cancellable, etc.

What is it that changed today that made you think that well-established multi-threading patterns are no longer relevant?


> What is it that changed today that made you think that well-established multi-threading patterns are no longer relevant?

Not patterns, but usage. I thought things like OpenCL would have made multi core CPU less relevant for intensive calculations, since GPUs are so much more powerful when you need to execute tasks at the same time.

And since processors were single threaded for a very long time, I was wondering what were threads being used for before multi core CPUs, and how did it really change things for GUIs. I mean threads were not really useful on single cores, were they ?

So it just seems to me that threads are just being made useful since multi cores CPUs, not really before. And unless you really need to take full advantage of the CPU when you're making a single app, your app is not always the single one being ran, cores can also run other apps not being threads. One simple software might not always need to take advantage of threads, unless it's a big software like a commercial 3d game.


>I mean threads were not really useful on single cores, were they ?

Every application you run has at least one thread or how did you think the main function is run? You won't be able to run multiple applications without multi-tasking.

>how did it really change things for GUIs.

GUI applications are usually single threaded. This means if you run anything blocking in that thread the entire application will freeze. The GUI thread can still continue if you run your blocking task in a worker thread.

The OS sheduler will take care of your threads even if you have only a single core to make sure everything remains responsive. (yes they were clearly talking about websites for mobile devices /sarcasm)

The only advantage of parallelism compared to concurrency is more performance.


> You won't be able to run multiple applications without multi-tasking.

But that doesn't mean you really need to make use of multi threading in your program, since the OS is already doing it.

> The only advantage of parallelism compared to concurrency is more performance.

Only if your program can be parallelized. And even if you do manage to parallelize it, in the best case, you'll only get a 4X or 8X performance increase, which is not a big order of magnitude.


GPUs are not suitable for many types of calculations.


I would be curious to have some examples.

Number crunching is almost always parallelizable. Computing is not always calculation. As long as you can simplify your program as a set of input/output models, OpenCL/CUDA will help a lot. Of course it's not a silver bullet, so often one might have to reorganize the problem to have a better performing solution.

The more you can tweak an algorithm to fit inside a set of stricter constraint, the better it will perform on a GPU.

Of course, if you have a hard problem, it's always better to be able to build hardware which targets a particular problem for optimal performance. Maybe I'd be more interested in multithreading when CPU will have at least 16 or 32 cores. 4 or 8 cores is not a lot.


In addition to the reasons others have already covered here, most operating systems have relatively expensive process forking--whereas threads can (and have been) implemented entirely in userspace.

So, if your program settled on a model of one "process" per connection, you could rapidly run into slowdowns for forking/execing, and you could also make the OS really unhappy with the number of processes running around. Instead, using threads, the "process" lives only in application code, and you can have as many or as few as you'd like, and the OS really won't care.

This, plus all of the usual points about shared memory, easier ownership and communication, simpler programming model, etc. etc.

There are use cases for all the options--OS-level processes, heavy threads ala pthreads, green threads ala JVM, and fibers ala custom engine code and Erlang.


Threads are one of the easiest paths to responsive applications. One thread for GUI and many for asynchronous background tasks(network, disk, compute heavy operations). Communicating and sharing between processes is more complex than between threads. Generally it is more OS-specific and processes have much higher overhead.

One easy example of a sane place for threading that would resonate with this crowd is HTTP servers. A thread pool to serve requests and a few asynchronous threads to handle DB operations and message queue interactions. Most frameworks are doing this for you (with real threads in languages that support it like C C++ Go Java and green threads in languages that don't Python Node/JS Ruby).


You can share resources between two threads, this is harder with processes.

The use case is, that you don't block the UI while doing heavy or slow work, e.g. generating previews in an image organizer or fetching http requests in a browser.

Instead of std::thread, I'd rather recommend using std::function and a threadpool like this one:

http://threadpool.sourceforge.net/


Last multithreaded C++ app I did was high speed deep packet analysis. For our purpose, we could do packet parsing in separate threads, but needed to consult and update shared data structures to keep track of stream state. It's awkward to do that in separate processes, and it doesn't lend itself to a GPU.


A program written in a linear style with blocking calls running on multiple threads will be far easier to read and understand than an async program written with callbacks and whatnot. And if you require low latency from any composite operation then you'll want to decompose it and run each part on its own thread.




Join us for AI Startup School this June 16-17 in San Francisco!

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: