際際滷

際際滷Share a Scribd company logo
Multithreading and
   Parallelism
Use cases
- 舒舒弍仂于舒仆 仆舒 multi-CPU 仄舒亳仆舒
  - 亳从仂仆舒仆仆 于亳亟亠
  - 弍仂弍从舒 弍仍仂 从仍从仂 亰舒仗亳于
- 亳仂于于舒仆仆 亰舒亳仄仂从 (hiding latency)
  - 弍亳仍亠仆仆, 亟仂从亳 亠从舒仄仂 仆舒 IO
- 亟亞从 UI (responsiveness)
  - 束丕仆亠仆仆晛 弍仍仂从ム亳 仂仗亠舒亶
Threads
Process
仂亠 于亳亰仆舒舒 virtual address space.
仂磪舒 亰仂仍, 仂从仍从亳
- 仗仂亠亳 仆亠 仄仂亢 仆舒仗礆 舒亟亠于舒亳
   仗舒仄 仆亳 仗仂亠于.
舒亰仂仄 亰 亳仄, 仗仍仆亠 于亳从仂亳舒仆仆:
- 仗仍仆舒 弍弍仍仂亠从舒 仄仂亢亠 于仂亟亳亳 亟仂
舒亟亠仆仂亞仂 仗仂仂 从仍从仂 仗仂亠于.
仂亠 仆亠 于亳从仂仆 从仂亟,
舒 仍亳亠 仆舒亟舒 亠亳  从仂仆亠从 亟仍
        于亳从仂仆舒仆仆 仗仂仂从于
仂仂从亳 (threads) 于亳从仂仆ム 从仂亟
仂仂从亳 于亳从仂仆ム 于 仄亠亢舒 仗仂亠
舒ム 亟仂仗 亟仂 于仂亞仂 舒亟亠仆仂亞仂 仗仂仂
仗仂亠.
仂亢亠仆 仗仂从 仄舒 于亶 亠从 舒 亰仆舒亠仆仆
亠亞于 CPU
Windows
- 舒亞舒仂亰舒亟舒仆舒 弌
- 亳仆ム亠 仗仍舒仆于舒仆仆 仆舒 仂仆仂于 仗仂亳亠于
  - (preemptive scheduling, priority-based)
- 仂从 于亳从仂仆 仆舒 弍亟-磻仂仄 CPU
- CPU 亰舒于亢亟亳 于亳从仂仆 仂亶 仗仂从, 磻亳亶 仄舒
  仆舒亶于亳亳亶 仗仂亳亠 ( 磻亳亶 亞仂仂于亳亶 亟仂
  于亳从仂仆舒仆仆)
仍舒仆于舒仆仆 (scheduling)
- 仂从 于亳从仂仆 仗仂磪仂仄 舒仍仂亞仂 仗亠仂亟 舒
   从于舒仆
- 亠仍亳亳仆舒 从于舒仆于 仄仂亢亠 弍亳 亰仆舒, 亰舒仍亠亢亳 于亟:
  - 仂仆亞舒 亳亠仄亳 (从仂仂从, 亟仂于亞)
  - 弌舒舒 仗仂亠 (舒从亳于仆亳亶, 仂仆仂于亳亶)
- 仂 亰舒从仆亠仆仆 从于舒仆舒 弌 仗亠亠于, 亳  亞仂仂于亳亶
  仗仂从 亰 舒从亳仄 亢亠 仗仂亳亠仂仄
- 亊从 仍从亳 亰磦仍 仗仂从 亰 于亳亳仄 仗仂亳亠仂仄,
  仗仂仂仆亳亶 仗仂从  于亳仆
  - 舒于 磻仂 亶仂亞仂 从于舒仆 仆亠 亰舒从仆亳于
亠亠从仍ム亠仆仆 从仂仆亠从
(context switching)
亳弍舒于亳 仆仂于亳亶 仗仂从 亟仍 于亳从仂仆舒仆仆, 弌
仗亠亠从仍ム舒 从仂仆亠从.
弍亠亞舒 舒仆 亠亞于 CPU + IP
仗仂仗亠亠亟仆仂亞仂 仗仂仂从.
亟仆仂于仍ムム 亠亞亳 CPU 仆仂于仂亞仂 仗仂仂从.
仂从 亰于仍仆 CPU, 从仂仍亳:
- 亠亠仂亟亳 于 舒仆 仂从于舒仆仆 舒仄仂亶仆仂
  - 亳从, 仄亠亠亢舒, 仗舒仄 (!), 亳仆仂仆亰舒
- 亳仆 仗仂仂从仂仄 亰 于亳亳仄 仗仂亳亠仂仄
  - 亊从亳亶 亰舒从仆亳于 仂 仂从于舒亳 (亟亳从, 仄亠亠亢舒,...)
  - 仂亞仂 仗仂亳亠 亰弍仍亳于
- 舒于亠亳于 从于舒仆
- 舒于亠亳于 仗仂从
亳仆舒仄仆亠 仗亟于亳亠仆仆
           仗仂亳亠
- 仍 亰舒从仆亠仆仆 于于仂亟/于亳于仂亟
- 仍 亰舒从仆亠仆仆 仂从于舒仆仆
- 亳 仗仂弍亟亢亠仆仆 GUI 仗仂仂从于 亠亠亰
  仂仗亠舒 亰 于从仆舒仄亳
- 仂仂于亳亶 亟仂 于亳从仂仆舒仆仆 仗仂从 亟仂于亳亶 舒 仆亠
  仄舒 舒仆 于亳从仂仆舒亳
丐舒从仂亢 仗亳 仂仄 仄仂亢亠 亰弍仍于舒亳 从于舒仆.
亳弍 CPU 亟仍 仗仂仂从
- 亳弍亳舒 仗仂亠仂, 磻亳亶 仗仂仂ム
- 亊从仂 仆亠仄舒 于仍仆仂亞仂 仗仂亠仂舒 
  于亳仆亠仆仆 仆舒 亟亠舒仍仆仂仄 仗仂亠仂
Scheduling granularity
Windows 仗仍舒仆 仗仂仂从亳, 仆亠 仗仂亠亳

舒仍亟仂从:
  仂亠  仄舒 1 仗仂从
  仂亠  仄舒 9 仗仂仂从于
  仂亠  仂亳仄舒 90% 仗仂亠仂仆仂亞仂 舒
  (亰舒 仄仂于亳 仂亟仆舒从仂于仂亞仂 仗仂亳亠 仗仂仂从于)
Threads in .NET
- 弌于仂亠仆仆 仗仂仂从:
  - new Thread(Action)
- 舒仗从:
  - Thread.Start()
- 从于舒仆仆 亟仂从亳 仗仂从 亰舒于亠亳:
  - Thread.Join()
Thread pool
- 仍 仗仂仂从于 于亳从仂仆 亰舒于亟舒仆仆
  于亳从仂亳仂于ム亳 于亢亠 于仂亠仆亳亶 仆舒弍
  仗仂仂从于
- 仂亟舒仆仆 仆仂于仂亞仂 亰舒于亟舒仆仆:
  - ThreadPool.QueueUserWorkItem(delegate)
UI message loop
- 亟亳仆 GUI 仗仂从 仂弍仂弍仍 仗仂于亟仂仄仍亠仆仆 亰 亠亞亳:
  - Clicks, repaints, mouse moves, key presses, 
- 仂亟 仂弍仂弍仍ム 仗仂仍亟仂于仆仂
- 亢亠, 磻仂 仂亟仆舒 仗仂亟 亰舒亶仄舒 亟仂于亞亳亶 舒, 亠舒
  弍亟 亠从舒亳
- 亢亠, 亟仂于亞仂亳于舒仍 仗仂亟 仆从仂仍亳 仆亠 仗仂于亳仆仆
  于亳从仂仆于舒亳 于 UI 仗仂仂
  - IO, 于舒亢从 仂弍亳仍亠仆仆
仆仂于仍亠仆仆 从仂仆仂仍于
- 乂仂弍 亰仄仆亳亳 从仂仆仂仍, 从仂亟 仗仂于亳仆亠仆
  于亳从仂仆于舒亳 于 UI 仗仂仂
- 仆 仗仂仂从亳 仄仂亢 仗仂亞舒仄仆仂 亟仂亟舒亳
  仗仂于亟仂仄仍亠仆仆 于 亠亞 UI 仗仂仂从
Demo
Task Parallel Library (TPL)
Since .NET 4.0
http://msdn.microsoft.com/en-us/library/dd460717.aspx
MSDN Parallel Computing Dev Center
Task
        http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx


弍舒亞 亰仆舒亠仆仆, 磻亠 弍亟亠* 亟仂仗仆亠 于
仄舒亶弍仆仂仄.

仆舒亠仆仆  亠亰仍舒仂仄
- 弍亳仍亠仆仆 (CPU)
- 于仂亟 (IO)

Task  .NET 亠舒仍亰舒 future and promise
仆舒亠仆仆 弍亟亠* 亟仂仗仆亠
- 仂亢仍亳于仂 于亢亠  亟仂仗仆亠
  - 丐舒从 亰舒于亠亳于 亟仂 亰于亠仆亠仆仆 亰舒 亠亰仍舒仂仄,
  - 丐舒从仂亢 舒从 仄亞 于亳从仂仆舒亳 于 仂仄 亢 仗仂仂
- 仂亢仍亳于仂 仆亠 弍亟亠, 弍仂 舒仆亠 仗仂仄亳仍从舒
- 弍仂 仂弍亳仍亠仆仆 弍亟亠 于亟仄仆亠仆仂
弌于仂亠仆仆  亰舒仗从
Task Task.Factory.StartNew(Action);
Task<TResult> Task.Factory.StartNew(Func<TResult>);

弍仂 Task constructor + Task.Start() method
亳从仂仆舒仆仆
Task  仆亠 仗仂从.
舒 亰舒仄仂于于舒仆仆礆 舒从亳 于亳从仂仆ム
仗仂仂从舒仄亳 亰 thread pool
舒仍亟仂从 1: 舒从 仄仂亢亠 仗仂舒亳 于亳从仂仆于舒亳 仆亠
仂亟舒亰
舒仍亟仂从 2: 亟仂于亞仂亳于舒仍亳亶 舒从 弍亟亠 亰舒亶仄舒亳 仗仂从
亰 thread pool
(亠亶 仗仂从 仆亠 亰仄仂亢亠 仗舒ミ火委亳 仆舒亟 亠仂 亰舒亟舒)
亳从仂仆舒仆仆 亟仂于亞仂亳于舒仍仂亞仂 Task`舒
亟亠 于仂亠仆仂 仂从亠仄亳亶 仗仂从

Task.Factory.StartNew(() =>
    { 
    },
    TaskCreationOptions.LongRunning);
舒于亠亠仆仆, 亠亰仍舒
- Task.Wait() // with optional timeout
- Task.Result

仂从 亰舒弍仍仂从, 仗仂从亳 舒从 仆亠
亰舒于亠亳
从于舒仆仆 亟亠从仍从仂 舒从于
Task.WaitAll(Task[]) // with optional timeout
Task.WaitAny(Task[])
Demo
Handle exceptions option 1
Task<int> t = Task.Factory.StartNew(() =>
    {
        ...
        throw new InvalidOperationException("error");
        return 42;
    });
                              丐 于亳仆亳从仆亠 Exception
int result = t.Result;
                               AggregateException


AggregateException.InnerException(s) 仄亳亳仄亠
仗仂舒从仂于亳亶 exception
Handle exceptions option 2
Check Task state:
- Task.IsCompleted
- Task.IsFaulted
- Task.Exception     AggregateException

- Task.Status
Unhandled exceptions
亊从仂 仆亠 仂弍仂弍亳亳 exception, TPL 亶仂亞仂 仗亠亠于亳从亳仆亠
仗亳 仆舒仍亰舒 Taska

亳从仍亳亠 仗仂亟
TaskScheduler.UnobservedTaskException


仂仄亳仍从舒 于于舒亢舒 仂弍仂弍仍亠仆仂 仗亳:
- 亳从仍亳从 Task.Result, Task.Wait() etc.
- 于亠舒仆仆 亟仂 Task.Exception
Demo
Continuations
舒亟舒舒: 仗仍 亰舒于亠亠仆仆 舒从舒 于亳从仂仆舒亳
仆舒仗仆亳亶.
 仆舒仗仆仂仄 舒从  亟仂仗仆亳亶 亠亰仍舒
仗仂仗亠亠亟仆仂亞仂.

Task<U> Task<T>.ContinueWith(antecedent => {...});


TaskFactory.ContinueWhenAll(Task[], tasks => {...});
Continuations, 仗仂仂弍亳
-   One-to-one
-   Many-to-one
-   One-to-many
-   Chain
Demo
亠磻 仗亳从仍舒亟亳 于亳从仂亳舒仆仆 Tasks
 - 仂磪仆亠仆仆 仗舒舒仍亠仍亰仄
   - 亳从仂仆舒仆仆 CPU-bound 亰舒亟舒 仗舒舒仍亠仍仆仂
   - 亳从仂仆舒仆仆 IO-bound 亰舒亟舒 仗舒舒仍亠仍仆仂
 - Responsive UI

                    Demo
弌亳仆仂仆亰舒
Data race
int count = 0;
for (int i = 0; i < data.Length; i++)
{
    var task = Task.Factory.StartNew(() =>
        {
            count++;     Not atomic!
        });
    tasks.Add(task);
}

Task.WaitAll(tasks.ToArray());
Preemption
      Thread A
reg = read count (1)             Thread B
                          reg = read count (1)

                          inc reg (2)

                          write reg to count (2)
inc reg (2)

write reg to count (2)
亠仆仆 1  interlocked
int count = 0;
for (int i = 0; i < data.Length; i++)
{
    var task = Task.Factory.StartNew(() =>
        {
                                                   Atomic,
            Interlocked.Increment(ref count);
                                                Flushes caches
        });
    tasks.Add(task);
}

Task.WaitAll(tasks.ToArray());
亠仆仆 2  locking (critical section)
int count = 0;
object syncRoot = new object();
for (int i = 0; i < data.Length; i++)
{
    var task = Task.Factory.StartNew(() =>
        {
            lock (syncRoot)       Other threads
            {                     cannot acquire
                                     held lock
                count++;
            }
        });
    tasks.Add(task);
}

Task.WaitAll(tasks.ToArray());
Parallel Loops
Parallel LINQ
Parallel.For() and ForEach()
舒弍仍仂从, 亟仂从亳 于 亠舒 仆亠 于亳从仂仆舒ム

 Parallel.For(0, data.Length, i =>
     {                                            仄仂亢仍亳于 亰仂弍亳亳
                                                 Break, 仗亠亠亟舒于亳 state
         ProcessItem(data, i);
     });

 Parallel.ForEach(data, value =>
     {
         ProcessItem(value);
     });
Parallel LINQ (PLINQ)
var result =
    from value in data.AsParallel()
    where value % 2 == 0
    let cube = Math.Pow(value, 3)
    let processed = ProcessItem(value)
    select new { Cube = cube, Result = processed };

parallelResult.ToArray();

                  亳从仂仆舒仆仆 仗仂仆亠
舒仂 舒从仂亢 亟亰仆舒亳 仗仂:
- Task.Status, Task lifecycle
    http://blogs.msdn.com/b/pfxteam/archive/2009/08/30/9889070.aspx

-   Continuations http://msdn.microsoft.com/en-us/library/dd235663
-   TaskSchedulers http://msdn.microsoft.com/en-us/library/dd997402
-   Cancellation http://msdn.microsoft.com/en-us/library/dd997364.aspx
-   Synchronization primitives http://msdn.microsoft.com/en-
    us/library/ms228964.aspx

- Concurrent collections http://msdn.microsoft.com/en-
    us/library/system.collections.concurrent.aspx

- 亠亰仗仍舒仆舒 从仆亳亢从舒, 亠 仂亟仆舒

More Related Content

What's hot (12)

System programing module 2
System programing module 2System programing module 2
System programing module 2
Andrii Hladkyi
5 亟亳亠仄舒 于于亠亟亠仆仆/于亳于亠亟亠仆仆. OPC
5 亟亳亠仄舒 于于亠亟亠仆仆/于亳于亠亟亠仆仆. OPC5 亟亳亠仄舒 于于亠亟亠仆仆/于亳于亠亟亠仆仆. OPC
5 亟亳亠仄舒 于于亠亟亠仆仆/于亳于亠亟亠仆仆. OPC
仗亠仆舒 仍亠从舒仆亟
System programing module 3
System programing module 3System programing module 3
System programing module 3
Andrii Hladkyi
1 于 仄舒亳仆舒
1 于 仄舒亳仆舒1 于 仄舒亳仆舒
1 于 仄舒亳仆舒
仗亠仆舒 仍亠从舒仆亟
仍7 ethernet
仍7 ethernet 仍7 ethernet
仍7 ethernet
仗亠仆舒 仍亠从舒仆亟
仆 仗亟亳亠仄亳
仆 仗亟亳亠仄亳仆 仗亟亳亠仄亳
仆 仗亟亳亠仄亳
仗亠仆舒 仍亠从舒仆亟
仍5 仂仆仂于亳 modbus tcp
仍5 仂仆仂于亳 modbus tcp仍5 仂仆仂于亳 modbus tcp
仍5 仂仆仂于亳 modbus tcp
仗亠仆舒 仍亠从舒仆亟
仍3 仂仆仂于亳 modbus
仍3 仂仆仂于亳 modbus仍3 仂仆仂于亳 modbus
仍3 仂仆仂于亳 modbus
仗亠仆舒 仍亠从舒仆亟
仂仂从亳亶 仂仗亳 仍舒弍仂舒仂仆仂亞仂 仗舒从亳从仄 仗仂 MOM
仂仂从亳亶 仂仗亳 仍舒弍仂舒仂仆仂亞仂 仗舒从亳从仄 仗仂 MOM仂仂从亳亶 仂仗亳 仍舒弍仂舒仂仆仂亞仂 仗舒从亳从仄 仗仂 MOM
仂仂从亳亶 仂仗亳 仍舒弍仂舒仂仆仂亞仂 仗舒从亳从仄 仗仂 MOM
仗亠仆舒 仍亠从舒仆亟
System programing module 1
System programing module 1System programing module 1
System programing module 1
Andrii Hladkyi

Viewers also liked (6)

cpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL Containerscpp-2013 #7 Templates and STL Containers
cpp-2013 #7 Templates and STL Containers
Amazon Web Services
Mobile applications development
Mobile applications developmentMobile applications development
Mobile applications development
Victor Matyushevskyy
cpp-2013 #15 Databases
cpp-2013 #15 Databasescpp-2013 #15 Databases
cpp-2013 #15 Databases
Amazon Web Services
cpp-2013 #18 Qt Part 2
cpp-2013 #18 Qt Part 2cpp-2013 #18 Qt Part 2
cpp-2013 #18 Qt Part 2
Amazon Web Services

Similar to Multithreading and parallelism (20)

System programing module 2. Threads
System programing module 2. ThreadsSystem programing module 2. Threads
System programing module 2. Threads
Andrii Hladkyi
"How we optimized our product without paid solutions", Dmytro Nemesh
"How we optimized our product without paid solutions", Dmytro Nemesh"How we optimized our product without paid solutions", Dmytro Nemesh
"How we optimized our product without paid solutions", Dmytro Nemesh
Fwdays
Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆
Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆
Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆
cit-cit
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
Anatoliy Okhotnikov
tsql
tsqltsql
tsql
eleksdev
个仆从 于 C++
个仆从 于 C++个仆从 于 C++
个仆从 于 C++
Alexander Kuzmenko
"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko
"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko
"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko
Fwdays
Rpc
RpcRpc
Rpc
eleksdev
DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...
DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...
DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...
DevOps_Fest
弍舒亰仂于I 从亳 舒仍亞仂亳仄 仂从 4
弍舒亰仂于I 从亳 舒仍亞仂亳仄 仂从 4弍舒亰仂于I 从亳 舒仍亞仂亳仄 仂从 4
弍舒亰仂于I 从亳 舒仍亞仂亳仄 仂从 4
弌于亠仍舒仆舒 舒于亟亳于舒
Tdd, 亳 亟亠?
Tdd, 亳 亟亠?Tdd, 亳 亟亠?
Tdd, 亳 亟亠?
Roman Mazur
01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5
仍亠亞 仍亞从亳亶
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
Exoft LLC
Clean code (UA)
Clean code (UA)Clean code (UA)
Clean code (UA)
Oleksandr Pavlyshak
System programing module 2. Threads
System programing module 2. ThreadsSystem programing module 2. Threads
System programing module 2. Threads
Andrii Hladkyi
"How we optimized our product without paid solutions", Dmytro Nemesh
"How we optimized our product without paid solutions", Dmytro Nemesh"How we optimized our product without paid solutions", Dmytro Nemesh
"How we optimized our product without paid solutions", Dmytro Nemesh
Fwdays
Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆
Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆
Lec16 仗仂仄i亢仆亠 仗仂亞舒仄仆亠 亰舒弍亠亰仗亠亠仆仆
cit-cit
iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)iPhone Objective-C Development (ukr) (2009)
iPhone Objective-C Development (ukr) (2009)
Anatoliy Okhotnikov
"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko
"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko
"Black Monday: The Story of 5.5 Hours of Downtime", Dmytro Dziubenko
Fwdays
DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...
DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...
DevOps Fest 2020. 仂仍仂亟亳仄亳 亠仍仆亳从. TuchaKube - 仗亠舒 从舒仆从舒 DevOps/Host...
DevOps_Fest
Tdd, 亳 亟亠?
Tdd, 亳 亟亠?Tdd, 亳 亟亠?
Tdd, 亳 亟亠?
Roman Mazur
01 c# basics
01 c# basics01 c# basics
01 c# basics
eleksdev
Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5Coding for Future in Lutsk. JavaScript. Part 5
Coding for Future in Lutsk. JavaScript. Part 5
仍亠亞 仍亞从亳亶
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
[Knowledge Sharing] - Behavioral patterns by Pavlo Serdyuk (UKR)
Exoft LLC

More from Victor Matyushevskyy (14)

仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server
仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server
仆仂于亳 舒亰 亟舒仆亳 舒 MS SQL Server
Victor Matyushevskyy
06.1 .Net memory management
06.1 .Net memory management06.1 .Net memory management
06.1 .Net memory management
Victor Matyushevskyy
06 LINQ
06 LINQ06 LINQ
06 LINQ
Victor Matyushevskyy
05 functional programming
05 functional programming05 functional programming
05 functional programming
Victor Matyushevskyy
04 standard class library c#
04 standard class library c#04 standard class library c#
04 standard class library c#
Victor Matyushevskyy
#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)
#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)
#3 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 2)
Victor Matyushevskyy
#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)
#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)
#2 弍'从仆仂 仂仆仂于舒仆亠 仗仂亞舒仄于舒仆仆 (. 1)
Victor Matyushevskyy

Multithreading and parallelism

  • 1. Multithreading and Parallelism
  • 2. Use cases - 舒舒弍仂于舒仆 仆舒 multi-CPU 仄舒亳仆舒 - 亳从仂仆舒仆仆 于亳亟亠 - 弍仂弍从舒 弍仍仂 从仍从仂 亰舒仗亳于 - 亳仂于于舒仆仆 亰舒亳仄仂从 (hiding latency) - 弍亳仍亠仆仆, 亟仂从亳 亠从舒仄仂 仆舒 IO - 亟亞从 UI (responsiveness) - 束丕仆亠仆仆晛 弍仍仂从ム亳 仂仗亠舒亶
  • 4. Process 仂亠 于亳亰仆舒舒 virtual address space. 仂磪舒 亰仂仍, 仂从仍从亳 - 仗仂亠亳 仆亠 仄仂亢 仆舒仗礆 舒亟亠于舒亳 仗舒仄 仆亳 仗仂亠于. 舒亰仂仄 亰 亳仄, 仗仍仆亠 于亳从仂亳舒仆仆: - 仗仍仆舒 弍弍仍仂亠从舒 仄仂亢亠 于仂亟亳亳 亟仂 舒亟亠仆仂亞仂 仗仂仂 从仍从仂 仗仂亠于.
  • 5. 仂亠 仆亠 于亳从仂仆 从仂亟, 舒 仍亳亠 仆舒亟舒 亠亳 从仂仆亠从 亟仍 于亳从仂仆舒仆仆 仗仂仂从于
  • 6. 仂仂从亳 (threads) 于亳从仂仆ム 从仂亟 仂仂从亳 于亳从仂仆ム 于 仄亠亢舒 仗仂亠 舒ム 亟仂仗 亟仂 于仂亞仂 舒亟亠仆仂亞仂 仗仂仂 仗仂亠. 仂亢亠仆 仗仂从 仄舒 于亶 亠从 舒 亰仆舒亠仆仆 亠亞于 CPU
  • 7. Windows - 舒亞舒仂亰舒亟舒仆舒 弌 - 亳仆ム亠 仗仍舒仆于舒仆仆 仆舒 仂仆仂于 仗仂亳亠于 - (preemptive scheduling, priority-based) - 仂从 于亳从仂仆 仆舒 弍亟-磻仂仄 CPU - CPU 亰舒于亢亟亳 于亳从仂仆 仂亶 仗仂从, 磻亳亶 仄舒 仆舒亶于亳亳亶 仗仂亳亠 ( 磻亳亶 亞仂仂于亳亶 亟仂 于亳从仂仆舒仆仆)
  • 8. 仍舒仆于舒仆仆 (scheduling) - 仂从 于亳从仂仆 仗仂磪仂仄 舒仍仂亞仂 仗亠仂亟 舒 从于舒仆 - 亠仍亳亳仆舒 从于舒仆于 仄仂亢亠 弍亳 亰仆舒, 亰舒仍亠亢亳 于亟: - 仂仆亞舒 亳亠仄亳 (从仂仂从, 亟仂于亞) - 弌舒舒 仗仂亠 (舒从亳于仆亳亶, 仂仆仂于亳亶) - 仂 亰舒从仆亠仆仆 从于舒仆舒 弌 仗亠亠于, 亳 亞仂仂于亳亶 仗仂从 亰 舒从亳仄 亢亠 仗仂亳亠仂仄 - 亊从 仍从亳 亰磦仍 仗仂从 亰 于亳亳仄 仗仂亳亠仂仄, 仗仂仂仆亳亶 仗仂从 于亳仆 - 舒于 磻仂 亶仂亞仂 从于舒仆 仆亠 亰舒从仆亳于
  • 9. 亠亠从仍ム亠仆仆 从仂仆亠从 (context switching) 亳弍舒于亳 仆仂于亳亶 仗仂从 亟仍 于亳从仂仆舒仆仆, 弌 仗亠亠从仍ム舒 从仂仆亠从. 弍亠亞舒 舒仆 亠亞于 CPU + IP 仗仂仗亠亠亟仆仂亞仂 仗仂仂从. 亟仆仂于仍ムム 亠亞亳 CPU 仆仂于仂亞仂 仗仂仂从.
  • 10. 仂从 亰于仍仆 CPU, 从仂仍亳: - 亠亠仂亟亳 于 舒仆 仂从于舒仆仆 舒仄仂亶仆仂 - 亳从, 仄亠亠亢舒, 仗舒仄 (!), 亳仆仂仆亰舒 - 亳仆 仗仂仂从仂仄 亰 于亳亳仄 仗仂亳亠仂仄 - 亊从亳亶 亰舒从仆亳于 仂 仂从于舒亳 (亟亳从, 仄亠亠亢舒,...) - 仂亞仂 仗仂亳亠 亰弍仍亳于 - 舒于亠亳于 从于舒仆 - 舒于亠亳于 仗仂从
  • 11. 亳仆舒仄仆亠 仗亟于亳亠仆仆 仗仂亳亠 - 仍 亰舒从仆亠仆仆 于于仂亟/于亳于仂亟 - 仍 亰舒从仆亠仆仆 仂从于舒仆仆 - 亳 仗仂弍亟亢亠仆仆 GUI 仗仂仂从于 亠亠亰 仂仗亠舒 亰 于从仆舒仄亳 - 仂仂于亳亶 亟仂 于亳从仂仆舒仆仆 仗仂从 亟仂于亳亶 舒 仆亠 仄舒 舒仆 于亳从仂仆舒亳 丐舒从仂亢 仗亳 仂仄 仄仂亢亠 亰弍仍于舒亳 从于舒仆.
  • 12. 亳弍 CPU 亟仍 仗仂仂从 - 亳弍亳舒 仗仂亠仂, 磻亳亶 仗仂仂ム - 亊从仂 仆亠仄舒 于仍仆仂亞仂 仗仂亠仂舒 于亳仆亠仆仆 仆舒 亟亠舒仍仆仂仄 仗仂亠仂
  • 13. Scheduling granularity Windows 仗仍舒仆 仗仂仂从亳, 仆亠 仗仂亠亳 舒仍亟仂从: 仂亠 仄舒 1 仗仂从 仂亠 仄舒 9 仗仂仂从于 仂亠 仂亳仄舒 90% 仗仂亠仂仆仂亞仂 舒 (亰舒 仄仂于亳 仂亟仆舒从仂于仂亞仂 仗仂亳亠 仗仂仂从于)
  • 14. Threads in .NET - 弌于仂亠仆仆 仗仂仂从: - new Thread(Action) - 舒仗从: - Thread.Start() - 从于舒仆仆 亟仂从亳 仗仂从 亰舒于亠亳: - Thread.Join()
  • 15. Thread pool - 仍 仗仂仂从于 于亳从仂仆 亰舒于亟舒仆仆 于亳从仂亳仂于ム亳 于亢亠 于仂亠仆亳亶 仆舒弍 仗仂仂从于 - 仂亟舒仆仆 仆仂于仂亞仂 亰舒于亟舒仆仆: - ThreadPool.QueueUserWorkItem(delegate)
  • 16. UI message loop - 亟亳仆 GUI 仗仂从 仂弍仂弍仍 仗仂于亟仂仄仍亠仆仆 亰 亠亞亳: - Clicks, repaints, mouse moves, key presses, - 仂亟 仂弍仂弍仍ム 仗仂仍亟仂于仆仂 - 亢亠, 磻仂 仂亟仆舒 仗仂亟 亰舒亶仄舒 亟仂于亞亳亶 舒, 亠舒 弍亟 亠从舒亳 - 亢亠, 亟仂于亞仂亳于舒仍 仗仂亟 仆从仂仍亳 仆亠 仗仂于亳仆仆 于亳从仂仆于舒亳 于 UI 仗仂仂 - IO, 于舒亢从 仂弍亳仍亠仆仆
  • 17. 仆仂于仍亠仆仆 从仂仆仂仍于 - 乂仂弍 亰仄仆亳亳 从仂仆仂仍, 从仂亟 仗仂于亳仆亠仆 于亳从仂仆于舒亳 于 UI 仗仂仂 - 仆 仗仂仂从亳 仄仂亢 仗仂亞舒仄仆仂 亟仂亟舒亳 仗仂于亟仂仄仍亠仆仆 于 亠亞 UI 仗仂仂从
  • 18. Demo
  • 19. Task Parallel Library (TPL) Since .NET 4.0 http://msdn.microsoft.com/en-us/library/dd460717.aspx MSDN Parallel Computing Dev Center
  • 20. Task http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx 弍舒亞 亰仆舒亠仆仆, 磻亠 弍亟亠* 亟仂仗仆亠 于 仄舒亶弍仆仂仄. 仆舒亠仆仆 亠亰仍舒仂仄 - 弍亳仍亠仆仆 (CPU) - 于仂亟 (IO) Task .NET 亠舒仍亰舒 future and promise
  • 21. 仆舒亠仆仆 弍亟亠* 亟仂仗仆亠 - 仂亢仍亳于仂 于亢亠 亟仂仗仆亠 - 丐舒从 亰舒于亠亳于 亟仂 亰于亠仆亠仆仆 亰舒 亠亰仍舒仂仄, - 丐舒从仂亢 舒从 仄亞 于亳从仂仆舒亳 于 仂仄 亢 仗仂仂 - 仂亢仍亳于仂 仆亠 弍亟亠, 弍仂 舒仆亠 仗仂仄亳仍从舒 - 弍仂 仂弍亳仍亠仆仆 弍亟亠 于亟仄仆亠仆仂
  • 22. 弌于仂亠仆仆 亰舒仗从 Task Task.Factory.StartNew(Action); Task<TResult> Task.Factory.StartNew(Func<TResult>); 弍仂 Task constructor + Task.Start() method
  • 23. 亳从仂仆舒仆仆 Task 仆亠 仗仂从. 舒 亰舒仄仂于于舒仆仆礆 舒从亳 于亳从仂仆ム 仗仂仂从舒仄亳 亰 thread pool 舒仍亟仂从 1: 舒从 仄仂亢亠 仗仂舒亳 于亳从仂仆于舒亳 仆亠 仂亟舒亰 舒仍亟仂从 2: 亟仂于亞仂亳于舒仍亳亶 舒从 弍亟亠 亰舒亶仄舒亳 仗仂从 亰 thread pool (亠亶 仗仂从 仆亠 亰仄仂亢亠 仗舒ミ火委亳 仆舒亟 亠仂 亰舒亟舒)
  • 24. 亳从仂仆舒仆仆 亟仂于亞仂亳于舒仍仂亞仂 Task`舒 亟亠 于仂亠仆仂 仂从亠仄亳亶 仗仂从 Task.Factory.StartNew(() => { }, TaskCreationOptions.LongRunning);
  • 25. 舒于亠亠仆仆, 亠亰仍舒 - Task.Wait() // with optional timeout - Task.Result 仂从 亰舒弍仍仂从, 仗仂从亳 舒从 仆亠 亰舒于亠亳
  • 26. 从于舒仆仆 亟亠从仍从仂 舒从于 Task.WaitAll(Task[]) // with optional timeout Task.WaitAny(Task[])
  • 27. Demo
  • 28. Handle exceptions option 1 Task<int> t = Task.Factory.StartNew(() => { ... throw new InvalidOperationException("error"); return 42; }); 丐 于亳仆亳从仆亠 Exception int result = t.Result; AggregateException AggregateException.InnerException(s) 仄亳亳仄亠 仗仂舒从仂于亳亶 exception
  • 29. Handle exceptions option 2 Check Task state: - Task.IsCompleted - Task.IsFaulted - Task.Exception AggregateException - Task.Status
  • 30. Unhandled exceptions 亊从仂 仆亠 仂弍仂弍亳亳 exception, TPL 亶仂亞仂 仗亠亠于亳从亳仆亠 仗亳 仆舒仍亰舒 Taska 亳从仍亳亠 仗仂亟 TaskScheduler.UnobservedTaskException 仂仄亳仍从舒 于于舒亢舒 仂弍仂弍仍亠仆仂 仗亳: - 亳从仍亳从 Task.Result, Task.Wait() etc. - 于亠舒仆仆 亟仂 Task.Exception
  • 31. Demo
  • 32. Continuations 舒亟舒舒: 仗仍 亰舒于亠亠仆仆 舒从舒 于亳从仂仆舒亳 仆舒仗仆亳亶. 仆舒仗仆仂仄 舒从 亟仂仗仆亳亶 亠亰仍舒 仗仂仗亠亠亟仆仂亞仂. Task<U> Task<T>.ContinueWith(antecedent => {...}); TaskFactory.ContinueWhenAll(Task[], tasks => {...});
  • 33. Continuations, 仗仂仂弍亳 - One-to-one - Many-to-one - One-to-many - Chain
  • 34. Demo
  • 35. 亠磻 仗亳从仍舒亟亳 于亳从仂亳舒仆仆 Tasks - 仂磪仆亠仆仆 仗舒舒仍亠仍亰仄 - 亳从仂仆舒仆仆 CPU-bound 亰舒亟舒 仗舒舒仍亠仍仆仂 - 亳从仂仆舒仆仆 IO-bound 亰舒亟舒 仗舒舒仍亠仍仆仂 - Responsive UI Demo
  • 37. Data race int count = 0; for (int i = 0; i < data.Length; i++) { var task = Task.Factory.StartNew(() => { count++; Not atomic! }); tasks.Add(task); } Task.WaitAll(tasks.ToArray());
  • 38. Preemption Thread A reg = read count (1) Thread B reg = read count (1) inc reg (2) write reg to count (2) inc reg (2) write reg to count (2)
  • 39. 亠仆仆 1 interlocked int count = 0; for (int i = 0; i < data.Length; i++) { var task = Task.Factory.StartNew(() => { Atomic, Interlocked.Increment(ref count); Flushes caches }); tasks.Add(task); } Task.WaitAll(tasks.ToArray());
  • 40. 亠仆仆 2 locking (critical section) int count = 0; object syncRoot = new object(); for (int i = 0; i < data.Length; i++) { var task = Task.Factory.StartNew(() => { lock (syncRoot) Other threads { cannot acquire held lock count++; } }); tasks.Add(task); } Task.WaitAll(tasks.ToArray());
  • 42. Parallel.For() and ForEach() 舒弍仍仂从, 亟仂从亳 于 亠舒 仆亠 于亳从仂仆舒ム Parallel.For(0, data.Length, i => { 仄仂亢仍亳于 亰仂弍亳亳 Break, 仗亠亠亟舒于亳 state ProcessItem(data, i); }); Parallel.ForEach(data, value => { ProcessItem(value); });
  • 43. Parallel LINQ (PLINQ) var result = from value in data.AsParallel() where value % 2 == 0 let cube = Math.Pow(value, 3) let processed = ProcessItem(value) select new { Cube = cube, Result = processed }; parallelResult.ToArray(); 亳从仂仆舒仆仆 仗仂仆亠
  • 44. 舒仂 舒从仂亢 亟亰仆舒亳 仗仂: - Task.Status, Task lifecycle http://blogs.msdn.com/b/pfxteam/archive/2009/08/30/9889070.aspx - Continuations http://msdn.microsoft.com/en-us/library/dd235663 - TaskSchedulers http://msdn.microsoft.com/en-us/library/dd997402 - Cancellation http://msdn.microsoft.com/en-us/library/dd997364.aspx - Synchronization primitives http://msdn.microsoft.com/en- us/library/ms228964.aspx - Concurrent collections http://msdn.microsoft.com/en- us/library/system.collections.concurrent.aspx - 亠亰仗仍舒仆舒 从仆亳亢从舒, 亠 仂亟仆舒