كيفية مزامنة الوصول إلى مورد مشترك في بيئة multithreading باستخدام Visual C#

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية816161
للحصول على إصدار Microsoft Visual Basic .NET من هذه المقالة، راجع 316136.

في هذه المهمة

الموجز
يمكنك إجراء عدة مهام في تطبيقات Microsoft Visual C# في نفس الوقت باستخدام multithreading. يمكن بدء تشغيل Multithreading مؤشرات الترابط المختلفة من إتمام مهام مختلفة في نفس الوقت. يعمل Multithreading أيضاً تحسين الأداء والاستجابة التطبيقات.

ولأنه مؤشرات ترابط متعددة الوصول مورد في نفس الوقت, قد تحتاج إلى مزامنة مؤشرات الترابط الفردية مع أجزاء أخرى من البرنامج. هذه المقالة تتناول هذه المقالة بعض وحدات السيناريو الشائعة مع برمجة multithreading وتشرح كيفية مزامنة الوصول إلى مورد مشترك بين مؤشرات ترابط متعددة.

back to the top

المساعدة في حماية الكمبيوتر البيانات العمومية في الوحدات النمطية في بيئة متعددة مؤشرات الترابط

حقول العامة في أساليب قابلة للوصول إلى كافة مؤشرات الترابط في التطبيق الخاص بك. يمكنك لمزامنة الوصول إلى حقول العامة استخدام الخاصية بدلاً من حقل واستخدامها كائن ReaderWriterLock للتحكم بالوصول الموجود. للقيام بذلك، اتبع الخطوات التالية:
  1. بدء تشغيل Microsoft Visual Studio.
  2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
  3. انقر فوق Visual C# المشاريع ضمن أنواع Project ثم انقر فوق تطبيق وحدة التحكم ضمن قوالب.

    ملاحظة في Visual Studio 2005 أو في 2008 Visual Studio انقر فوق Visual C# ضمن أنواع Project ثم انقر فوق تطبيق وحدة التحكم ضمن قوالب.
  4. في مربع النص اسم اكتب MultiThreadApplication ومن ثم انقر فوق موافق.
  5. استبدال التعليمات البرمجية الموجودة التعليمة البرمجية التالية في Class1.cs.

    ملاحظة في Visual Studio 2005 وفي 2008 Visual Studio الملف الافتراضي هو النظام Program.cs.
    using System;using System.Threading;namespace MultiThreadApplication{	class Class1	{		private ReaderWriterLock rwl = new ReaderWriterLock();		private long myNumber;		public long Number   // the Number property		{			get			{				//Acquire a read lock on the resource.				rwl.AcquireReaderLock(Timeout.Infinite);                				try				{					Console.WriteLine("Thread:{0} starts getting the Number", Thread.CurrentThread.GetHashCode());					Thread.Sleep(50);					Console.WriteLine("Thread:{0} got the Number", Thread.CurrentThread.GetHashCode());				}				finally				{					//Release the lock.					rwl.ReleaseReaderLock();				}				return myNumber;			}			set			{				//Acquire a write lock on the resource.				rwl.AcquireWriterLock(Timeout.Infinite);				try				{					Console.WriteLine("Thread: {0} start writing the Number", Thread.CurrentThread.GetHashCode());					Thread.Sleep(50);					myNumber = value;					Console.WriteLine("Thread: {0} written the Number", Thread.CurrentThread.GetHashCode());				}				finally				{					//Release the lock.					rwl.ReleaseWriterLock();				}			}		}				[STAThread]		static void Main(string[] args)		{			Thread []threadArray = new Thread[20]; 			int threadNum;			Class1 Myclass = new Class1();			ThreadStart myThreadStart = new ThreadStart(Myclass.AccessGlobalResource);			//Create 20 threads.			for( threadNum = 0; threadNum < 20; threadNum++)			{				threadArray[threadNum] = new Thread(myThreadStart);			}			//Start the threads.			for( threadNum = 0; threadNum < 20; threadNum++)			{   				threadArray[threadNum].Start();			}			//Wait until all the thread spawn out finish.			for( threadNum = 0; threadNum < 20; threadNum++)				threadArray[threadNum].Join();			Console.WriteLine("All operations have completed. Press enter to exit");			Console.ReadLine();		}		public void AccessGlobalResource()		{			Random rnd = new Random();			long theNumber;						if (rnd.Next() % 2 != 0)				theNumber = Number;			else			{				theNumber = rnd.Next();				Number = theNumber;			}		}	}}
  6. إنشاء المشروع ثم قم بتشغيل التطبيق.
back to the top

المساعدة في جعل الكمبيوتر فئة آمن مؤشر الترابط

قد حاول مؤشرات ترابط متعددة للوصول إلى كائن في نفس الوقت. عند يزاحم مؤشر ترابط واحد أو أكثر للوصول إلى كائن في نفس الوقت ، قد تظهر بعض مؤشرات الترابط حالة غير صالحة إذا مؤشر ترابط آخر تعديل المورد في نفس الوقت. على سبيل المثال، إذا يقرأ مؤشر ترابط حقل الكائن بينما يكون مؤشر ترابط آخر تعديل الحقل ، قد تتلقى مؤشر ترابط الأول حالة غير صالحة للحقل. يدعى هذا الموقف حالة تعارض.

لتجنب هذا الموقف يمكنك المساعدة على حماية مقاطع هامة من التعليمات البرمجية من حالات السباق باستخدام التأمين. يسمح تأمين تمثيل Visual C# الكلمة الأساسية التأمين بيان ، مسار تنفيذ واحد التنفيذ للحصول على حقوق تنفيذ خاص على كائن. توضح الخطوات التالية المثال التأمين:
  1. افتح Visual Studio.
  2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
  3. انقر فوق Visual C# المشاريع ضمن أنواع Project ثم انقر فوق تطبيق وحدة التحكم ضمن قوالب.

    ملاحظة في Visual Studio 2005 أو في 2008 Visual Studio انقر فوق Visual C# ضمن أنواع Project ثم انقر فوق تطبيق وحدة التحكم ضمن قوالب.
  4. في مربع النص اسم اكتب MultiThreadLockApplication ومن ثم انقر فوق موافق.
  5. استبدال التعليمات البرمجية الموجودة في التعليمات البرمجية التالية في "النظام" Class1.cs:
    using System;using System.Threading;namespace MultiThreadLockApplication{	class Student	{		private static string myTeacherName = "Bill";		private string myName = "Grace";		private static object somePrivateStaticObject = new Object();		public static string TeacherName		{			get			{				string theName;				// Synchronize access to the shared member.				lock(somePrivateStaticObject)				{					Console.WriteLine("Thread {0} starts to get the teacher's name",Thread.CurrentThread.GetHashCode());					theName = myTeacherName;					// Wait for 0.3 second.					Thread.Sleep(300);					Console.WriteLine("Thread {0} finished to get the teacher's name:{1}.", Thread.CurrentThread.GetHashCode(), theName);				}				return theName;			}			set			{				lock(somePrivateStaticObject)				{					Console.WriteLine("Thread {0} starts to set the teacher's name.", Thread.CurrentThread.GetHashCode());					myTeacherName = value;					// Wait for 0.3 second.					Thread.Sleep(300);					Console.WriteLine("Thread {0} finished to set the teacher's name:{1}.", Thread.CurrentThread.GetHashCode(), value);				}			}		}		public string GetName()		{			string theName;			lock(this)			{				Console.WriteLine("Thread {0} starts to get the student's name.", Thread.CurrentThread.GetHashCode());				theName = myName;				// Wait for 0.3 second.				Thread.Sleep(300);				Console.WriteLine("Thread {0} finished to get the student's name:{1}", Thread.CurrentThread.GetHashCode(), theName);				return theName;			}		}		public string SetName(string NewName)		{			string theOldName;			lock(this)			{				Console.WriteLine("Thread {0} starts to set the student's name.", Thread.CurrentThread.GetHashCode());				theOldName = myName;				myName = NewName;				// Wait for 0.3 second.				Thread.Sleep(300);				Console.WriteLine("Thread {0} finished to set the student's name:{1}", Thread.CurrentThread.GetHashCode(), NewName);			}			return theOldName;		}	}	class Class1	{		public static int WorkItemNum = 20;		public static AutoResetEvent Done = new AutoResetEvent(false);		public static void AccessClassResource(object state)		{			Random rnd = new Random();			string theName;			Student AStudent = (Student) state;			if( (rnd.Next() %2) != 0)			{				if( (rnd.Next() %2) != 0)				{					switch (rnd.Next() %3 )					{						case 0:							Student.TeacherName = "Tom";							break;						case 1:							Student.TeacherName = "Mike";							break;						case 2:							Student.TeacherName = "John";							break;					}				}				else				{					theName = Student.TeacherName;				}			}			else			{				if( (rnd.Next() %2) != 0)				{					switch (rnd.Next() %3 )					{						case 0:							AStudent.SetName("Janet");							break;						case 1:							AStudent.SetName("David");							break;						case 2:							AStudent.SetName("Ben");							break;					}				}				else				{					theName = AStudent.GetName();				}			}			if(Interlocked.Decrement( ref WorkItemNum) == 0)			{				Done.Set();			}		}		[STAThread]		static void Main(string[] args)		{			int threadNum;			Student AStudent = new Student();			// Queue up 20 work items in the ThreadPool.			for (threadNum = 0 ; threadNum <= WorkItemNum -1 ; threadNum++) 			{				ThreadPool.QueueUserWorkItem(new WaitCallback(AccessClassResource),AStudent);			}			Done.WaitOne();			Console.WriteLine("All operations have completed. Press enter to exit");			Console.ReadLine();		}	}}
  6. إنشاء المشروع ثم قم بتشغيل التطبيق.
back to the top
مراجع
لمزيد من المعلومات، راجع مواقع شبكة مطوري Microsoft (MSDN) التالي على الويب:back to the top

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 816161 - آخر مراجعة: 07/14/2008 23:26:40 - المراجعة: 3.1

Microsoft Visual C# 2008 Express Edition, Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbmt kbthreadsync kbthread kbhowtomaster KB816161 KbMtar
تعليقات