Apartment Process Global Data Thread Instruction Instruction Apartment
Имплементации на многозадачност Apartment Process Global Data Thread Instruction Instruction Apartment Threading фдгдфгсдф Free Threading
System. App. Domain #1 App. Domain #2 App. Domain #3 Global Data Thread Instruction Thread App. Domain #4 Thread Instruction Global Data Instruction фдгдфгсдф
Как работи многонишковостта Pull From Queue Instruction Thread Interrupt Thread Return to Queue фдгдфгсдф Thread Running Queue Time Slice Instruction
Малък пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter { static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Start(); t 2. Start(); } }фдгдфгсдф
Малък пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter { static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Start(); t 2. Start(); } }фдгдфгсдф
Малък пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter { static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Start(); t 2. Start(); } }фдгдфгсдф
Малък пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter { static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Start(); t 2. Start(); } }фдгдфгсдф
Малък пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter { static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Start(); t 2. Start(); } }фдгдфгсдф
Малък пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter { static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Start(); t 2. Start(); } }фдгдфгсдф
Малък пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter { static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Start(); t 2. Start(); } }фдгдфгсдф
Малък пример //Резултат: Thread 1: job(1) Thread 1: job(2) Thread 2: job(1) Thread 1: job(3). . . Thread 1: job(53) Thread 2: job(46) Thread 2: job(47) Thread 1: job(54). . . Thread 1: job(97) Thread 2: job(99) Thread 1: job(98) Thread 1: job(99) фдгдфгсдф
Жизнен цикъл на нишките Start() Is. Alive Suspend() Sleep() Wait. X() All Done Join() Suspended Wait. Sleep. Join Interrupt() Resume() фдгдфгсдф Expire time Interrupt() Notified Aimed Thread Destroyed Abort() Stopped Thread Stopped
По-важните членове на Thread l public Thread( Thread. Start ); l Създава инстанция l Подава се делегат с метод, който да се изпълни при стартиране l l l l Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() Start() фдгдфгсдф
По-важните членове на Thread l public Thread( Thread. Start start); l Sleep() l “Приспива” текущата нишка за указания брой милисекунди (и наносекунди) l Извиква се само от самата нишка l l l Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() Start() фдгдфгсдф
T T T Instruction Thread Instruction from Q ueue T To Sleep Queue T Instruction Thread Sleep() Thread Clock Interrupt фдгдфгсдф Thread Running Queue Малко повече за Sleep()
Приспиване на нишка using System; using System. Threading; public class Thread. Sleep { public static Thread worker; public static Thread worker 2; public static void Main() { Console. Write. Line("Entering void Main!"); worker = new Thread(new Thread. Start(Counter)); worker 2 = new Thread(new Thread. Start(Counter 2)); worker. Start(); worker 2. Start(); Console. Write. Line("Exiting void Main!"); } (примерът продължава) фдгдфгсдф
Приспиване на нишка } public static void Counter() { Console. Write. Line("Entering Counter"); for(int i = 1; i < 50; i++) { Console. Write(i + " "); if(i == 10) Thread. Sleep(1000); } Console. Write. Line("n. Exiting Counter"); } public static void Counter 2() { Console. Write. Line("Entering Counter 2"); for(int i = 51; i < 100; i++) { Console. Write(i + " "); if( i == 70 ) Thread. Sleep(5000); } Console. Write. Line(“n. Exiting Counter 2"); } фдгдфгсдф
l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() l Suspend() l l l Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() Start() l Ако нишката е в състояние Running, я преустановява временно (suspend) l ако е преустановена, не се случва нищо фдгдфгсдф
l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() l Подновява нишка, която е била преустановена (suspended) l Ако нишката работи, не прави нищо l l l l l Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() Start() фдгдфгсдф
l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() l Is. Alive l l l l l Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() Start() l true, ако е стартирана и не е спряна прекъсната или прекратена l Повече информация дава Thread. State фдгдфгсдф
l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background l Преден план (foreground) и фонов режим (background) l Свойство за смяна/извличане l l l l Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() Start() фдгдфгсдф
l l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread l Свойство за смяна/извличане l true, ако нишката принадлежи l l l l thread pool, иначе false Name Priority Thread. State Abort() Interrupt() Join() Start() фдгдфгсдф на managed
l l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread l Name l Всяка нишка в. NET Framework може да име l Свойство за смяна/извличане на името l l l Priority Thread. State Abort() Interrupt() Join() Start() фдгдфгсдф
l l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name l Priority l l l Thread. State Abort() Interrupt() Join() Start() l Lowest, Below. Normal, Normal (по подразбиране), Above. Normal, Highest l Свойство за промяна/извличане фдгдфгсдф
l l l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State l Съдържа състоянието на нишката – зависи от това дали нишката работи l Свойство само за извличане l l Abort() Interrupt() Join() Start() фдгдфгсдф
l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() l Обикновено “убива” нишката l Хвърля Thread. Abort. Exception извиканата нишка l l l Interrupt() Join() Start() фдгдфгсдф в
l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() l Събужда l l нишка ако е в състояние Wait. Sleep. Join, иначе не прави нищо l Хвърля Thread. Interrupted. Exception Join() Start() фдгдфгсдф
l l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() l Извикващата нишка изчаква, докато извиканата приключи l Може да се укаже таймаут (timeout) l Start() фдгдфгсдф
l l l l По-важните членове на Thread public Thread( Thread. Start start); Sleep() Suspend() Resume() Is. Alive Is. Background Is. Thread. Pool. Thread Name Priority Thread. State Abort() Interrupt() Join() l Start() l Стартира посочената нишка l Операцията не е блокираща (връща управлението веднага) фдгдфгсдф
Приоритет – пример class First. Thread { public void Do. Task 1() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 1: job({0})", i); } public void Do. Task 2() { for( int i=0; i<100; i++ ) Console. Write. Line("Thread 2: job({0})", i); } } class Starter static void Main(string[] args) { First. Thread ft = new First. Thread(); Thread t 1 = new Thread( new Thread. Start(ft. Do. Task 1)); Thread t 2 = new Thread( new Thread. Start(ft. Do. Task 2)); t 1. Priority = Thread. Priority. Highest; t 1. Start(); t 2. Start(); } } фдгдфгсдф
Приоритет Резултат: Thread 1: job(1) Thread 1: job(2) Thread 2: job(1) Thread 1: job(3). . . Thread 1: job(97) Thread 1: job(98) Thread 2: job(85) Thread 1: job(99) Thread 2: job(86). . . Thread 2: job(97) Thread 2: job(98) Thread 2: job(99) фдгдфгсдф
Състоянията в Thread. State l Aborted(256) l Извикан е метода Abort() l Нишката е в състояние Stopped, едновременно с Aborted Abort. Requested(128) l Background(4) l Running(0) l Stopped(16) l Stop. Requested(1) l Suspended(64) l Suspend. Requested(2) l Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) l Abort. Requested(128) l Методът Abort() е бил извикан l Още не е получила Thread. Abort. Exception, което ще се опита да я прекрати Background(4) l Running(0) l Stopped(16) l Stop. Requested(1) l Suspended(64) l Suspend. Requested(2) l Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) l Background(4) l l Нишката е във фонов режим l Променя се със свойството Thread. Is. Background Running(0) l Stopped(16) l Stop. Requested(1) l Suspended(64) l Suspend. Requested(2) l Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) Background(4) l Running(0) l l l Нишката е стартирана и не е блокирана l Няма чакащо изключение Thread. Aborted. Exception Stopped(16) l Stop. Requested(1) l Suspended(64) l Suspend. Requested(2) l Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) Background(4) Running(0) l Stopped(16) l l Нишката е отговорила на заявка от Abort() или l Прекратила е работата си доброволно Stop. Requested(1) l Suspended(64) l Suspend. Requested(2) l Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) Background(4) Running(0) Stopped(16) l Stop. Requested(1) l l l Поискано е било от нишката да спре работа l Само за вътрешна употреба Suspended(64) l Suspend. Requested(2) l Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) Background(4) Running(0) Stopped(16) Stop. Requested(1) l Suspended(64) l l l Нишката е била преустановена l Независимо колко пъти е извикан Suspend(), един Resume() е достатъчен Suspend. Requested(2) l Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) Background(4) Running(0) Stopped(16) Stop. Requested(1) Suspended(64) l Suspend. Requested(2) l l l l Извикан е метода Suspend() l Изчаква се да стигне до стабилно състояние, за да се преустанови Unstarted(8) фдгдфгсдф l Wait. Sleep. Join(32) l
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) Background(4) Running(0) Stopped(16) Stop. Requested(1) Suspended(64) Suspend. Requested(2) l Unstarted(8) l l l l Не е стартирана, стартира се със Start() l След като се стартира нишката никога повече не може пак да е в това състояние l Wait. Sleep. Join(32) фдгдфгсдф
Състоянията в Thread. State l Aborted(256) Abort. Requested(128) Background(4) Running(0) Stopped(16) Stop. Requested(1) Suspended(64) Suspend. Requested(2) Unstarted(8) l Wait. Sleep. Join(32) l l l l l Нишката е блокирана l Става с един от методите Thread. Wait(), фдгдфгсдф Thread. Sleep(), Thread. Join()
Прекратяване на нишки – пример public class Background. Thread { public void Do. Background. Job() { try { // Нишката извършва някаква работа } } catch(Thread. Interrupted. Exception) { Message. Box. Show("Thread interrupted. "); } catch(Thread. Abort. Exception) { Message. Box. Show("Thread aborted. "); } finally { Message. Box. Show("Finally block. "); } Message. Box. Show("After finally block. "); }фдгдфгсдф (примерът продължава)
Прекратяване на нишки – пример public class Interrupt. Abort. Demo { private Thread m. Bg. Thread; public Interrupt. Abort. Demo() { bg = new Background. Thread(); m. Bg. Thread = new Thread(new Thread. Start(bg. Do. Background. Job)); m. Bg. Thread. Is. Background = true; m. Bg. Thread. Start(); } private void btn. Suspend_Click(. . . ) { m. Bg. Thread. Suspend(); } (примерът продължава) фдгдфгсдф
Прекратяване на нишки – пример private void btn. Resume_Click(. . . ) { m. Bg. Thread. Resume(); } private void btn. Interrupt_Click(. . . ) { m. Bg. Thread. Interrupt(); } } private void btn. Abort_Click(. . . ) { m. Bg. Thread. Abort(); } фдгдфгсдф
l Демонстрация #6 Използване на Priority, State, Suspend, Resume, Interrupt и Abort фдгдфгсдф
Thread Local Storage – пример class Threads { public void Create. Data. Thread() { Local. Data. Store. Slot slot = Thread. Allocate. Named. Data. Slot("my. Slot"); //Записваме важни данни в Named. Slot Thread. Set. Data(slot , "IMPORTANT DATA"); // Suspend-ваме Thread. Current. Thread. Suspend(); // Прочитаме отново данните object my. Data = Thread. Get. Data("my. Slot"); } public void Read. Data. Thread() { Local. Data. Store. Slot slot = Thread. Get. Named. Data. Slot("my. Slot"); // Опитваме се да променим информацията } } фдгдфгсдф Thread. Set. Data(slot, "BAD DATA"); (примерът продължава)
Thread Local Storage – пример class TLSDemo { static void Main(string[] args) { Threads threads = new Threads(); Thread create. Data = new Thread( new Thread. Start(threads. create. Data. Thread) ); create. Data. Start(); Thread. Data = new Thread( new Thread. Start(threads. read. Data. Thread) ); read. Data. Start(); read. Data. Join(); create. Data. Resume(); } } фдгдфгсдф
Thread-Relative Static Fields – пример class Thread. Static { static void Main(string[] args) { for( int i=0; i<10; i++ ) { new Thread(new Thread. Start(new My. Thread(). Do. Task)). Start(); } } } class My. Thread { [Thread. Static] public static int abc; public My. Thread() { abc=42; // This runs in the main app. thread } public void Do. Task() { abc++; Console. Write. Line("abc={0}", abc); } } фдгдфгсдф
Race Condition – пример using System; using System. Threading; class Account { public int m. Balance; public void Withdraw 100() { int old. Balance = m. Balance; Console. Write. Line("Withdrawing 100. . . "); Thread. Sleep(100); int new. Balance = old. Balance - 100; m. Balance = new. Balance; } } фдгдфгсдф (примерът продължава)
Race Condition – пример static void Main(string[] args) { Account acc = new Account(); acc. m. Balance = 500; Console. Write. Line("Account balance = acc. m. Balance); Thread user 1 = new Thread( new Thread. Start(acc. Withdraw 100) Thread user 2 = new Thread( new Thread. Start(acc. Withdraw 100) user 1. Start(); user 2. Start(); user 1. Join(); user 2. Join(); Console. Write. Line("Account balance = acc. m. Balance); } фдгдфгсдф {0}", ); ); {0}",
Synchronized Contexts – пример [Synchronization. Attribute] class CBO : Context. Bound. Object { public void Do. Some. Task 1() { Console. Write. Line("Job 1 started. "); Thread. Sleep(2000); Console. Write. Line("Job 1 finished. n"); } } фдгдфгсдф public void Do. Some. Task 2() { Console. Write. Line("Job 2 started. "); Thread. Sleep(1500); Console. Write. Line("Job 2 finished. n"); } (примерът продължава)
Synchronized Contexts – пример static void Main() { CBO sync. Class = new CBO(); Console. Write. Line("Started 6 threads: n" + "3 doing Job 1 and 3 doing Job 2. nn"); for (int i=0; i<6; i++) { Thread t; if (i%2==0) t = new Thread( new Thread. Start( sync. Class. Do. Some. Task 1) ); else t = new Thread( new Thread. Start( sync. Class. Do. Some. Task 2) ); t. Start(); } } фдгдфгсдф
Критични секции – пример public class Monitor. Enter. Exit { private int m. Counter; public void Critical. Section() { Monitor. Enter(this); m. Counter = 0; try { for(int i = 1; i <= 5; i++) { Console. Write(++m. Counter); Thread. Sleep(1000); } } finally { Monitor. Exit(this); } } (примерът продължава) фдгдфгсдф
Критични секции – пример static void Main() { Monitor. Enter. Exit mee = new Monitor. Enter. Exit(); Thread thread 1 = new Thread(new Thread. Start(mee. Critical. Section)); thread 1. Start( ); Thread thread 2 = new Thread(new Thread. Start(mee. Critical. Section)); thread 2. Start( ); } } // Резултат: 12345 // Резултат без синхронизация: 1123456789 фдгдфгсдф
Wait() и Pulse() – пример public void Do. Job() { lock (m. Sync) { Monitor. Pulse(m. Sync); for(int i = 1; i <= 3; i++) { Console. Write. Line("{0}: Pulsе", m. Name); Monitor. Pulse(m. Sync); Console. Write. Line("{0}: Wait", m. Name); Monitor. Wait(m. Sync); } } } фдгдфгсдф } Console. Write. Line("{0}: Woke. Up", m. Name); Thread. Sleep(1000); (примерът продължава)
Wait() и Pulse() – пример public class Wait. Pulse. Demo { public static void Main(String[] args) { object sync = new object(); Wait. Pulse wp 1 = new Wait. Pulse( "Wait. Pulse 1", sync); Thread thread 1 = new Thread( new Thread. Start(wp 1. Do. Job)); thread 1. Start(); } Wait. Pulse wp 2 = new Wait. Pulse( "Wait. Pulse 2", sync); Thread thread 2 = new Thread( new Thread. Start(wp 2. Do. Job)); thread 2. Start(); } фдгдфгсдф
[Method. Impl. Attribute (Method. Impl. Options. Synchronized)] Прилича на lock върху цял метод l Може да синхронизира и static членове [Method. Impl(Method. Impl. Options. Synchronized)] l public void Do. Some. Task 1() { Console. Write. Line("job 1 started"); for (int i=0; i<100000; i++) Math. Sqrt(i); Console. Write. Line("Job 1 done. n"); } фдгдфгсдф
Mutex – пример class Mutex. Demo { Mutex m. Mutex; public Mutex. Demo(Mutex a. Mutex) { m. Mutex = a. Mutex; } public void Perform. Some. Task() { m. Wait. One(); Console. Write. Line("n. Job started. . . "); for( int i=0; i<10; i++) { Thread. Sleep(100); Console. Write("|"); } Console. Write. Line("n. Job finished. "); m. Release. Mutex(); } } фдгдфгсдф
Auto. Reset. Event/Manual. Reset. Event using System; using System. Threading; class One. Who. Waits { Wait. Handle m. Wait. Handle; int m. Wait. Time; public One. Who. Waits(Wait. Handle a. Wait. Handle, int wait. Time ) { m. Wait. Handle = a. Wait. Handle; m. Wait. Time = m. Wait. Time; } public void perform. Some. Task() { Thread. Sleep(m. Wait. Time); Console. Write. Line("Thread {0} waiting", Thread. Current. Thread. Get. Hash. Code()); m. Wait. Handle. Wait. One(); } } (примерът продължава) фдгдфгсдф
Auto. Reset. Event/Manual. Reset. Event class Main. Class { static void Main() { Manual. Reset. Event evnt = new Manual. Reset. Event(false); for (int i=0; i<10; i++ ) { One. Who. Waits oww = new One. Who. Waits(evnt, (i+1)*500); Thread thread = new Thread( new Thread. Start(oww. perform. Some. Task)); thread. Start(); } for (int i=0; i<10; i++) { Console. Read. Line(); evnt. Set(); } } } фдгдфгсдф
Interlocked – пример class Test. Interlocked. Increment { static long m. Unsafe. Counter = 0; static long m. Safe. Counter = 0; private static void Do. Task() { while (true) { m. Unsafe. Counter++; Interlocked. Increment(ref m. Safe. Counter); } фдгдфгсдф } if (m. Safe. Counter % 10000000 == 0) { Console. Write. Line("Safe={0}, Unsafe={1}", m. Safe. Counter, m. Unsafe. Counter); }
Interlocked – пример static void Main(string[] args) { for (int i=0; i<5; i++) { Thread thread = new Thread( new Thread. Start(Do. Task)); thread. Start(); } } } // Резултат: // Safe=10000000, // Safe=20000000, // Safe=30000000, // Safe=40000000, // Safe=50000000, //. . . фдгдфгсдф Unsafe=5846325 Unsafe=15846326 Unsafe=25846326 Unsafe=35846325 Unsafe=41356463
Thread. Pool. Queue. User. Work. Item class Thread. Pool. Demo { public static void Long. Task(object a. Param) { Console. Write. Line("Started: {0}. ", a. Param); Thread. Sleep(500); Console. Write. Line("Finished: {0}. ", a. Param); } static void Main() { for (int i=1; i<=100; i++) { string task. Name = "Task" + i; Thread. Pool. Queue. User. Work. Item(new Wait. Callback(Long. Task), task. Name); } } } фдгдфгсдф Console. Read. Line();
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Thread. Pool. Register. Wait. For. Single. Object using. . . public class Example { public static void Main(string[] args) { Auto. Reset. Event ev =new Auto. Reset. Event(false); object param = "some param"; Registered. Wait. Handle r = Thread. Pool. Register. Wait. For. Single. Object( ev, new Wait. Or. Timer. Callback(Wait. Proc), param, 1000, false ); Console. Read. Line(); Console. Write. Line("signaling. "); ev. Set(); Console. Read. Line(); Console. Write. Line("unregister wait"); r. Unregister(ev); Console. Read. Line(); } public static void Wait. Proc(object param, bool timed. Out) { string cause = "SIGNALED"; if (timed. Out) cause = "TIMED OUT"; Console. Write. Line("Wait. Proc executes; cause = {0}", cause); фдгдфгсдф }}
Демонстрация #16 l Register. Wait. For. Single. Object фдгдфгсдф
System. Threading. Reader. Writer. Lock Имплементира най-популярния синхронизационен проблем – Reader/Writer Problem l Is. Reader. Lock. Held l Is. Writer. Lock. Held l Acquire. Reader. Lock l Acquire. Writer. Lock l Release. Reader. Lock l Release. Writer. Lock l фдгдфгсдф
System. Threading. Reader. Writer. Lock class Resource { Reader. Writer. Lock rwl = new Reader. Writer. Lock(); public void Read() { rwl. Acquire. Reader. Lock(Timeout. Infinite); try { // Many can read, writers are blocked } finally { rwl. Release. Reader. Lock(); } } public void Write() { rwl. Acquire. Writer. Lock(Timeout. Infinite); try { // One can write, readers blocked } finally { rwl. Release. Writer. Lock(); } } } фдгдфгсдф
Custom. Reader. Writer class Custom. Reader. Writer { private int m. Readers = 0; private bool m. Is. Writing = false; public void Read() { lock( this ) { while (m. Is. Writing) Monitor. Wait( this ); m. Readers++; } //. . . READING TAKES PLACE HERE. . . lock( this ) { m. Readers--; if( m. Readers == 0 ) Monitor. Pulse(this); } фдгдфгсдф } (примерът продължава)
Custom. Reader. Writer class Custom. Reader. Writer { private int m. Readers = 0; private bool m. Is. Writing = false; public void Read() { lock( this ) { while (m. Is. Writing) Monitor. Wait( this ); m. Readers++; } //. . . READING TAKES PLACE HERE. . . lock( this ) { m. Readers--; if( m. Readers == 0 ) Monitor. Pulse(this); } фдгдфгсдф } (примерът продължава)
Custom. Reader. Writer class Custom. Reader. Writer { private int m. Readers = 0; private bool m. Is. Writing = false; public void Read() { lock( this ) { while (m. Is. Writing) Monitor. Wait( this ); m. Readers++; } //. . . READING TAKES PLACE HERE. . . lock( this ) { m. Readers--; if( m. Readers == 0 ) Monitor. Pulse(this); } фдгдфгсдф } (примерът продължава)
Custom. Reader. Writer class Custom. Reader. Writer { private int m. Readers = 0; private bool m. Is. Writing = false; public void Read() { lock( this ) { while (m. Is. Writing) Monitor. Wait( this ); m. Readers++; } //. . . READING TAKES PLACE HERE. . . lock( this ) { m. Readers--; if( m. Readers == 0 ) Monitor. Pulse(this); } фдгдфгсдф } (примерът продължава)
Custom. Reader. Writer public void Write() { lock( this ) { while( m. Readers != 0 ) Monitor. Wait( this ); m. Is. Writing = true; } //. . . WRITING TAKES PLACE HERE. . . } lock( this ) { m. Is. Writing = false; Monitor. Pulse. All( this ); } }фдгдфгсдф
Custom. Reader. Writer public void Write() { lock( this ) { while( m. Readers != 0 ) Monitor. Wait( this ); m. Is. Writing = true; } //. . . WRITING TAKES PLACE HERE. . . } lock( this ) { m. Is. Writing = false; Monitor. Pulse. All( this ); } }фдгдфгсдф
Custom. Reader. Writer public void Write() { lock( this ) { while( m. Readers != 0 ) Monitor. Wait( this ); m. Is. Writing = true; } //. . . WRITING TAKES PLACE HERE. . . } lock( this ) { m. Is. Writing = false; Monitor. Pulse. All( this ); } }фдгдфгсдф
Custom. Reader. Writer public void Write() { lock( this ) { while( m. Readers != 0 ) Monitor. Wait( this ); m. Is. Writing = true; } //. . . WRITING TAKES PLACE HERE. . . } lock( this ) { m. Is. Writing = false; Monitor. Pulse. All( this ); } }фдгдфгсдф
Synchronized Wrappers l l l По подразбиране стандартните колекции (Array. List, Queue, Stack) не са thread safe Hashtable е thread safe (1 писач, N четеца) Synchronized Wrapper е синхронизирана обвивка около колекцията l Връща синхронизирана версия на колекцията Stack safe. Stack = Stack. Synchronized(stack); l l При Hashtable – threadsafe (N писача, N четеца) Свойството ICollection. Sync. Root lock (bit. Array. Sync. Root) { // Perform thread unsafe operations here } фдгдфгсдф
Асинхронно извикване чрез делегат using System; using System. Threading; class Async. Call { public delegate int My. Delegate(int a, int b); public int Sum(int a, int b) { Thread. Sleep(3000); return a+b; } static void Main(string[] args) { My. Delegate async. Call = new My. Delegate(new Async. Call(). Sum); Console. Write. Line("Starting method async. "); фдгдфгсдф
Асинхронно извикване чрез делегат IAsync. Result status = async. Call. Begin. Invoke(5, 6, null); Console. Write. Line("Async method is working"); } } Console. Write. Line("Calling End. Invoke()"); int result = async. Call. End. Invoke(status); Console. Write. Line("End. Invoke() returned"); Console. Write. Line("Result={0}", result); // Резултат: Starting method asynchronously Asynchronous method is working now Calling End. Invoke() // тук има пауза, заради Sleep() End. Invoke() returned Result=11 фдгдфгсдф
IAsync. Result public interface IAsync. Result { object Async. State {get; } Wait. Handle Async. Wait. Handle {get; } bool Completed. Synchronously {get; } bool Is. Completed {get; } } l фдгдфгсдф Completed. Synchronously връща true ако асинхронният метод е приключил работа преди края на извикването на Begin. Invoke метода (т. е. ако работи прекалено бързо)
IAsync. Result public interface IAsync. Result { object Async. State {get; } Wait. Handle Async. Wait. Handle {get; } bool Completed. Synchronously {get; } bool Is. Completed {get; } } Is. Completed връща true ако асинхронният метод е приключил работа l Може да се използва чрез механизма "polling" – през определено време да се проверява истинността на Is. Completed докато върне true l фдгдфгсдф
- Slides: 166