نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

استفاده از متغیرهای شرط برای کنترل روابط زمان بندی. ضمیمه

برای اینکه بتوان منطق را در برنامه پیاده سازی کرد، از دستورات شرطی استفاده می شود. از نظر گمانه‌زنی، این عملگرها را می‌توان به‌عنوان نقاط کلیدی نشان داد که با رسیدن به آن‌ها برنامه انتخاب می‌کند که در کدام یک از جهت‌های ممکن حرکت کند. به عنوان مثال، شما می خواهید تعیین کنید که آیا یک متغیر arg دارای عدد مثبت یا منفی است و پیام مناسب را روی صفحه نمایش دهید. برای این کار می توانید از دستور if (if) که چنین بررسی هایی را انجام می دهد استفاده کنید.

در ساده ترین حالت، نحو دستور if این است:

اگر (بیان)

اگر مقدار پارامتر عبارت true باشد، دستور اجرا می شود، در غیر این صورت توسط برنامه حذف می شود. لازم به ذکر است که «بیان» یک عبارت شرطی است که در آن شرایطی آزمایش می شود. روی میز. 2.1 انواع عبارات منطقی ساده دستور if را ارائه می دهد.

جدول 2.1. عبارات بولی ساده

در اینجا مثالی از استفاده از عملگر if شعبه آورده شده است. برنامه زیر به شما امکان می دهد علامت متغیر وارد شده را تعیین کنید.

فهرست 2.1. اولین برنامه برای تعیین علامت عدد وارد شده.

#عبارتند از
int main()
{
شناور x;
printf("شماره را وارد کنید:");
scanf("%f"،&x);
if (x >= 0)

بازگشت 0;
}

تجزیه و تحلیل متن برنامه بالا نشان می دهد که دو عبارت شرطی را می توان با استفاده از ساختار جایگزین کرد

اگر (بیان)

که این گونه تعبیر می شود. اگر "expression" درست باشد، "statement1" اجرا می شود، در غیر این صورت "statement2" اجرا می شود. بیایید مثال قبلی را برای تعیین علامت یک عدد با استفاده از این ساختار بازنویسی کنیم.

لیست 2.2. برنامه دوم برای تعیین علامت عدد وارد شده.

#عبارتند از
int main()
{
شناور x;
printf("شماره را وارد کنید:");
scanf("%f"،&x);
if(x printf("عدد وارد شده %f منفی است.\n"، x);
دیگر
printf("عدد وارد شده %f غیر منفی است.\n"، x);

بازگشت 0;
}

در مثال های ارائه شده، تنها یک تابع printf() بعد از دستور if و else وجود دارد. در مواردی که باید بیش از یک عبارت نوشته شود که یک شرط برآورده شود، باید از براکت های فرفری استفاده شود. از ساختاری مانند استفاده کنید

اگر (بیان)
{

}
دیگر
{

لازم به ذکر است که پس از کلمه کلیدی else، یک دستور if دیگر را می توان به طور رسمی قرار داد، در نتیجه ساختاری حتی انعطاف پذیرتر از انتقال های شرطی دریافت می کنیم:

if (عبارت 1)
else if (expression2)
دیگر

لیست 2.3 برنامه ای را نشان می دهد که آخرین ساختار پرش شرطی را اجرا می کند.

لیست 2.3. برنامه سوم برای تعیین علامت عدد وارد شده.

#عبارتند از
int main()
{
شناور x;
printf("شماره را وارد کنید:");
scanf("%f"،&x);
if(x printf("عدد وارد شده %f منفی است.\n"، x);
else if (x > 0)
printf("عدد %f وارد شده مثبت است.\n"، x);
دیگر
printf("عدد وارد شده %f غیر منفی است.\n",x);

بازگشت 0;
}

تا اینجا شرایط ساده ای مانند x && - منطقی AND را در نظر گرفته ایم
|| - یا منطقی
! - نه منطقی

بر اساس این سه عملیات منطقی می توان شرایط پیچیده تری را شکل داد. به عنوان مثال، اگر سه متغیر exp1، exp2 و exp3 وجود داشته باشد، آنها می توانند ساختارهای منطقی ارائه شده در جدول را تشکیل دهند. 2.2.

جدول 2.2. نمونه ای از عبارات منطقی مرکب

مانند عملیات ضرب و جمع در ریاضیات، عملیات منطقی و یا نه نیز اولویت های خاص خود را دارند. عملیات NO بالاترین اولویت را دارد، یعنی. چنین عملیاتی ابتدا انجام می شود. عملگر AND کمترین اولویت را دارد و در نهایت عملگر OR کمترین اولویت را دارد. این اولویت ها باید هنگام تهیه پیش نویس شرایط پیچیده در نظر گرفته شوند. به عنوان مثال، شرط

if(4 6 || 5 به این صورت آزمایش می شود. اگر 4 6 یا 5 if(4 6 || 5 از بسیاری از احتمالات. به طور رسمی، می توانید از ساختار if else if ... else استفاده کنید. با این حال، در بسیاری از موارد آن را استفاده از دستور switch زبان C ++ راحت تر است. نحو این دستور به شرح زیر است:

سوئیچ (متغیر)
{
حالت ثابت 1:

حالت ثابت 2:

...
پیش فرض:

این عملگر به صورت متوالی برابری متغیر را با ثابت های بعد از کلمه کلیدی case بررسی می کند. اگر هیچ یک از ثابت ها با مقدار متغیر برابر نباشد، عبارات بعد از کلمه default اجرا می شوند. دستور switch دارای ویژگی زیر است. فرض کنید مقدار متغیر برابر با مقدار ثابت1 باشد و عبارات بعد از اولین کلمه کلیدی مورد اجرا قرار گیرد. پس از آن، اجرای برنامه با بررسی متغیر برای برابری ثابت2 ادامه خواهد یافت، که اغلب منجر به صرف غیرقابل توجیه منابع رایانه می شود. برای جلوگیری از این وضعیت، باید از دستور break برای پرش به دستور بعدی بعد از سوئیچ استفاده کنید.

فهرست 2.4 نمونه ای از برنامه نویسی یک دستور سوئیچ شرطی را نشان می دهد.

لیست 2.4. نمونه ای از استفاده از دستور switch.

#عبارتند از
int main()
{
intx;
printf("شماره را وارد کنید:");
scanf("%d"،&x);
سوئیچ (x)
{
case 1: printf("شماره 1\n وارد شده است"); break;
case 2: printf("شماره 2\n وارد شده است"); زنگ تفريح؛
پیش فرض: printf("شماره دیگری وارد شده است\n");
}
چارچ;
printf("نویسه را وارد کنید:");
scanf("%c"،&ch);
سوئیچ (ch)
{
case 'a' : printf("شخصیت a\n وارد شده"); زنگ تفريح؛
case 'b' : printf("نویسه b\n وارد شده"); زنگ تفريح؛
پیش فرض: printf ("یک کاراکتر دیگر وارد شده\n");
}
بازگشت 0;
}

این مثال دو کاربرد متفاوت از دستور switch را نشان می دهد. در حالت اول، تجزیه و تحلیل رقم وارد شده، در حالت دوم، تجزیه و تحلیل کاراکتر وارد شده انجام می شود. لازم به ذکر است که این عملگر تنها بر اساس برابری آرگومان خود با یکی از مقادیر موردی فهرست شده، یعنی. بررسی عبارات نوع x

متغیرهای شرط

متغیر شرطسمافور را نشان می دهد که برای سیگنال دادن به یک رویداد که رخ داده است استفاده می شود. یک یا چند فرآیند (یا رشته) از فرآیندها یا رشته‌های دیگر می‌توانند منتظر سیگنالی باشند که یک رویداد رخ داده است. تفاوت بین متغیرهای شرط و سمافورهای mutex مورد بحث در بالا باید درک شود. هدف سمافور mutex و قفل‌های خواندن و نوشتن همگام‌سازی دسترسی به داده‌ها است، در حالی که متغیرهای شرط معمولاً برای همگام‌سازی توالی عملیات استفاده می‌شوند. در این مورد، در کتاب خود برنامه نویسی شبکه یونیکسدبلیو ریچارد استیونز آن را به زیبایی بیان کرده است: Mutexe ها باید برای مسدود کردن استفاده شوند، نه برای انتظار. ».

در فهرست 4-6، موضوع "مصرف کننده" حاوی یک حلقه بود:

15 while(TextFiles.empty())

نخ "مصرف کننده" حلقه را تا صف تکرار کرد فایل های متنیعناصر بودند. این حلقه را می توان با یک شرطی جایگزین کرد مترانا موضوع تولید کننده با سیگنالی به مصرف کننده اطلاع می دهد که اقلام در صف قرار گرفته اند. رشته "مصرف کننده" می تواند صبر کند تا سیگنالی را دریافت کند و سپس به پردازش صف ادامه دهد.

متغیر شرط از نوع pthread_cond_t است. انواع عملیاتی که می تواند انجام دهد به شرح زیر است:

مقداردهی اولیه؛

تخریب؛

انتظار؛

انتظار با محدودیت زمانی؛

سیگنالینگ آدرس؛

سیگنال دهی جهانی؛

عملیات اولیه سازی و تخریب توسط متغیرهای شرطی مانند سایر mutexeها انجام می شود. توابع کلاس pthread_cond_t،که این عملیات را اجرا می کنند در جدول آمده است. 5.7.

جدول 5.7. توابع کلاس pthread_cond_t که عملیات متغیر شرط را پیاده سازی می کنند

متغیرهای شرط در ارتباط با mutexes استفاده می شوند. اگر بخواهید یک mutex را قفل کنید، رشته یا فرآیند تا زمانی که mutex آزاد نشود مسدود می شود. پس از باز شدن قفل، موضوع یا فرآیند mutex را بدست می آورد و به کار خود ادامه می دهد. هنگام استفاده از یک متغیر شرط، باید با یک mutex همراه باشد.

pthread_mutex_lock(&Mutex) ;

pthread_cond_wait(&EventMutex, &Mutex);

pthread_mutex_unlock(&Mutex) ;

بنابراین، برخی از کارها تلاش می کنند تا mutex را قفل کنند. اگر mutex قبلا قفل شده باشد، این وظیفه مسدود می شود. پس از باز کردن قفل، وظیفه mutex را آزاد می کند موتکسو در همان زمان منتظر سیگنال متغیر شرط می ماند EventMutex . اگر mutex قفل نشود، وظیفه به طور نامحدود منتظر سیگنال خواهد بود. هنگام انتظار با محدودیت زمانی، وظیفه برای مدت زمان مشخصی منتظر سیگنال می ماند. اگر این زمان قبل از دریافت سیگنال بگذرد، تابع یک کد خطا را برمی‌گرداند. سپس وظیفه مجدداً mutex را درخواست می کند.

با انجام سیگنالینگ آدرس، یک وظیفه به رشته یا فرآیند دیگری اطلاع می دهد که رویدادی رخ داده است. اگر وظیفه ای منتظر سیگنال برای متغیر شرط معین باشد، آن کار باز می شود و mutex به آن داده می شود. اگر چندین کار به طور همزمان منتظر سیگنال برای متغیر شرط معین باشند، تنها یکی از آنها باز می شود. بقیه وظایف در صف منتظر می مانند و طبق استراتژی زمان بندی استفاده شده آزاد می شوند. هنگامی که یک عملیات سیگنال دهی سراسری انجام می شود، تمام وظایفی که منتظر سیگنال برای متغیر شرط مشخص شده هستند، اعلان دریافت می کنند. هنگامی که چندین کار باز می شود، آنها برای مالکیت mutex بر اساس استراتژی زمان بندی استفاده شده رقابت می کنند. برخلاف عملیات انتظار، وظیفه ای که عملیات سیگنالینگ را انجام می دهد ادعای مالکیت mutex را ندارد، اگرچه باید.

متغیر شرط نیز دارای یک شیء ویژگی است که توابع آن در جدول آمده است. 5.8.

جدول 5.8. توابعی برای دسترسی به یک شیء ویژگی برای متغیر شرطی از نوع pthread_cond_t


بین المللی pthread_condattr_init(pthread_condattr_t * attr) شیء ویژگی متغیر شرط مشخص شده توسط پارامتر attr را با مقادیر پیش‌فرض برای همه ویژگی‌های تعریف‌شده توسط پیاده‌سازی راه‌اندازی می‌کند.

بین المللی pthread_condattr_destroy(pthread_condattr_t * attr) ; شیء ویژگی متغیر شرطی که توسط پارامتر attr مشخص شده است را از بین می برد. این شی را می توان با فراخوانی ()pthread_condattr_init مجدداً مقداردهی کرد.

بین المللی pthread_condattr_setpshared(pthread_condattr_t * attr,int pshared);

بین المللی pthread_condattr_getpshared(const pthread_condattr_t * limit attr, int *restrict pshared); خصیصه اشتراک فرآیند شی ویژگی متغیر شرط مشخص شده توسط پارامتر attr را تنظیم یا برمی گرداند. پارامتر pshared می تواند حاوی مقادیر زیر باشد:

PTHREAD_PROCESS_SHARED(قفل خواندن و نوشتن را فعال می کند که توسط هر رشته ای که به حافظه اختصاص داده شده برای این متغیر شرط دسترسی دارد، به اشتراک گذاشته شود، حتی اگر رشته ها به فرآیندهای مختلف تعلق داشته باشند).

PTHREAD_PROCESS_PRIVATE(متغیر شرط بین رشته های یک فرآیند مشترک است)

بین المللی pthread_condattr_setclock(pthread_condattr_t * attr, clockid_t clock_id);

بین المللی pthread_condattr_getclock(const pthread_condattr_t * محدود کردن attr، clockid_t * محدود کردن clock_id)؛ یک ویژگی را تنظیم یا برمی گرداند ساعتشی ویژگی متغیر شرط مشخص شده توسط پارامتر attr. صفت ساعتنشان دهنده شناسه ساعت مورد استفاده برای اندازه گیری محدودیت زمانی در تابع ()pthread_cond_timedwait است. به طور پیش فرض، ویژگی ساعت از شناسه ساعت سیستم استفاده می کند

آگهی

متغیرکمیتی است که دارای نام و مقدار است. متغیرها با استفاده از کلمه var اعلان می شوند: var x = 12, y; در اینجا دو متغیر به نام های x و y معرفی می شوند، x روی 12 تنظیم شده و y تعریف نشده است، یعنی دستور trace trace (y); نتیجه را تعریف نشده می دهد (مقدار تعریف نشده است). دستور trace(z) همان نتیجه را ایجاد می کند. زیرا متغیر z اصلا شناخته نشده است. برای تشخیص یک متغیر موجود از یک متغیر ناشناخته، می توانید یک مقدار null ویژه برای آن بنویسید: var y = null ;

اگر نوع یک متغیر به صراحت مشخص نشده باشد، می تواند هر مقداری را به خود بگیرد. مثلا:

var x = 1; // عدد x = "کو-کو!" ; // رشته x = false ; // مقدار بولی

با این حال، هنگام اعلان بهتر است به صراحت نوع متغیر را مشخص کنید. این اجازه می دهد تا بسیاری از خطاها حتی قبل از اجرای برنامه شناسایی شوند. سه نوع ساده وجود دارد:

  • شماره - شماره؛
  • رشته - یک رشته;
  • Boolean یک مقدار بولی است.
نوع متغیر بعد از نام آن مشخص می شود و با دو نقطه جدا می شود var x:Number = 0, y:String = "qq" , b:Boolean = false ; رشته های کاراکتر محصور شده در گیومه ها یا آپاستروف های منفرد را می توان روی متغیرهایی از نوع String نوشت: var s1:String = "qq1"، s2:String = "qq2"; متغیرهای بولی فقط دو مقدار دارند: true (true) و false (false): var b:Boolean = false ; b = درست b = (a در حالت دوم، مقدار متغیر b درست خواهد بود اگر شرط سمت راست علامت مساوی درست باشد.

اگر بخواهید مقداری از نوع اشتباه را روی یک متغیر بنویسید، بلافاصله پس از ترجمه برنامه (یعنی زمانی که به کدهای ماشین ترجمه می شود) پیام خطا دریافت خواهید کرد و نه در زمان اجرا. به عنوان مثال، این کد یک خطا می دهد:

varx:number = 1; x = "کو-کو!" ;

دید متغیر

سه نوع متغیر وجود دارد: متغیرهای جهانی با استفاده از توصیفگر _global اعلان می شوند: _global .x = 12; توجه داشته باشید که کلمه var در اینجا مورد نیاز نیست، چنین متغیرهایی به عنوان ویژگی های شی _global در نظر گرفته می شوند. متغیر x اعلام شده در بالا از هر تابع و از هر کد کلیپ به سادگی با نام قابل دسترسی است.

اگر چندین متغیر با یک نام در محدوده وجود داشته باشد، ابتدا متغیر محلی، سپس متغیر کلیپ فعلی و تنها پس از آن متغیر سراسری جستجو می‌شود.

متغیرهای کلیپ‌های دیگر «مشاهده نمی‌شوند»، برای ارجاع به آن‌ها باید به صراحت کلیپ والد را مشخص کنید:

Mc.x = 1; _root.x = 12; _parent.x = 123;

وظیفه

علامت = برای تخصیص یک مقدار جدید به یک متغیر استفاده می شود. نام متغیر در سمت چپ آن و عبارت در سمت راست نوشته شده است: a = 4*(c + 2) + 3 / (r - 4*w) + d % 3; علامت * به معنای ضرب، علامت / به معنای تقسیم و % به معنای گرفتن باقی مانده تقسیم است.

در یک عبارت، عملیات حسابی به ترتیب زیر انجام می شود:

  • اقدامات در پرانتز؛
  • ضرب، تقسیم و گرفتن باقی مانده (از چپ به راست)؛
  • جمع و تفریق (از چپ به راست).
این دستور نامیده می شود اولویت( ارشدیت ) عملیات حسابی .

رشته های کاراکتر را می توان با استفاده از عملگر + "الحاق" کرد:

No=20; s = "Vasya" + "برای پیاده روی رفت." ; qq = "شیء" + no; اگر عبارت شامل داده هایی از انواع مختلف باشد، تبدیل خودکار به همان نوع وجود دارد. بنابراین در خط آخر رشته Object20 روی متغیر qq نوشته می شود.

اغلب، برنامه ها از عملگرهای ++ ( افزایش، متغیر را 1 افزایش دهید و -- ( کاهش، با کاهش 1 متغیر). اپراتورها

I++; k --; معنی همان i = i + 1; k = k - 1; همچنین یک مخفف برای عملیات حسابی وجود دارد: a += 20; b -= c - d; c *= a + b; d /= 2*c; f% = 12; این کد را می توان با عملگرهای زیر به شکل "عادی" جایگزین کرد: a = a + 20; b = b - (c - d)؛ c = c * (a + b); d = d / (2 * c); f = f % 12

اشیاء

شی چیزی است که دارای ویژگی ها و روش هایی است. در محیط زیست فلاشاشیاء داخلی وجود دارد (مانند Array، MovieClip، Key). علاوه بر این، می توانید اشیاء خود را بسازید: var car = new Object (); car.v = 10; car.year = 1998; در محیط زیست فلاششما می توانید از برنامه نویسی شی گرا استفاده کنید، یعنی کلاس های خود را از اشیاء ایجاد کنید، آنها را با ویژگی ها و روش ها اعطا کنید (به مبحث 13 مراجعه کنید).

ویژگی اصلی اشیاء به اصطلاح آدرس دهی ارجاعی است. یعنی هنگام اعلام

var obj = New Object(); متغیر obj خود شی را ذخیره نمی کند، بلکه فقط آن را ذخیره می کند آدرس(اشاره به شیء). بنابراین، عملگر انتساب obj2 = obj; یک شی جدید در حافظه ایجاد نمی کند که کپی شی obj باشد، بلکه به سادگی آدرس اولین شی را در متغیر obj2 کپی می کند. پس از آن، obj و obj2 به یک شی اشاره می کنند. اگر واقعاً بخواهیم یک کپی از شی ای که آدرس آن در obj ذخیره شده است بسازیم، می توانیم این کار را انجام دهیم: var obj2 = new Object (); for (prop in obj) obj2 = obj; در اینجا، در یک حلقه، تمام ویژگی های شی اول مرتب شده و به دومی کپی می شود. متغیر prop (رشته کاراکتر) نام ویژگی بعدی است. مدخل Obj به معنای " ویژگی شی obj که نام آن در prop ذخیره می شود».

متغیرهای شرط

یک متغیر شرط (condvar مخفف متغیر شرط است) برای مسدود کردن یک رشته در برخی شرایط در طول اجرای یک بخش بحرانی کد استفاده می‌شود. شرط می تواند به طور دلخواه پیچیده باشد و به متغیر شرط بستگی ندارد. با این حال، یک متغیر شرط همیشه باید همراه با یک mutex برای آزمایش یک شرط استفاده شود.

متغیرهای شرط از ویژگی های زیر پشتیبانی می کنند:

در انتظار یک متغیر شرطی (صبر) ( pthread_cond_wait());

باز کردن قفل یک جریان (سیگنال) ( pthread_cond_signal())

رفع انسداد جریان های متعدد (پخش) ( pthread_cond_broadcast()),

در اینجا مثالی از استفاده معمولی از متغیر شرط آورده شده است:

pthread_mutex_lock (&m) ;-…

در حالی که (!شرط خودسرانه) (

pthread_cond_wait(&cv, &m);

pthread_mutex_unlock(&m) ;

در این مثال، mutex قبل از بررسی شرط به دست می آید. بنابراین، شرط بررسی شده فقط برای رشته فعلی اعمال می شود. تا زمانی که شرط درست باشد، این بخش از کد در تماس انتظار بلوک می‌شود تا زمانی که رشته‌ای دیگر یک یا چند موضوع را بر روی متغیر شرط انجام دهد.

حلقه while در مثال بالا به دو دلیل مورد نیاز است. اولاً، استانداردهای posix عدم وجود بیداری کاذب را تضمین نمی کنند (به عنوان مثال، در سیستم های چند پردازنده). دوم، اگر موضوع دیگری شرایط را تغییر دهد، باید دوباره بررسی شود تا مطمئن شوید که تغییر با معیارهای پذیرفته شده مطابقت دارد. هنگامی که یک رشته منتظر بلاک می شود، mutex مرتبط با متغیر شرط به صورت اتمی توسط تابع آزاد می شود. pthread_cond_wait()به طوری که یک رشته دیگر بتواند وارد بخش مهمی از کد شود.

رشته ای که یک رشته را رفع انسداد انجام می دهد، رشته با اولویت بالاتر را که در متغیر شرط در صف قرار می گیرد، رفع انسداد می کند. یک عملیات باز کردن انسداد چند رشته، همه رشته‌های در صف متغیر شرط را از حالت انسداد خارج می‌کند. mutex مرتبط با متغیر شرط توسط نخ قفل اتمی با بالاترین اولویت آزاد می شود. پس از پردازش بخش بحرانی کد، این موضوع باید mutex را آزاد کند.

نوع دیگری از عملیات انتظار متغیر شرط ( pthread__cond_timedwair()) به شما این امکان را می دهد که یک بازه زمانی تعیین کنید. در پایان این دوره می توان تاپیک انتظار را رفع انسداد کرد.

موانع

مانع یک مکانیسم همگام سازی است که اجازه می دهد تا رشته های تعاملی متعددی با هم هماهنگ شوند تا هر یک از آنها در یک نقطه معین متوقف شوند و قبل از ادامه کار خود منتظر رشته های دیگر باشند.

بر خلاف تابع pthreadjoin()، جایی که یک نخ منتظر است تا نخ دیگری تکمیل شود، مانع رزوه می شود ملاقاتدر یک نقطه خاص پس از اینکه تعداد نخ های مشخص شده به مانع مجموعه رسید، همهاین تاپیک ها مسدود می شوند و به کار خود ادامه می دهند. مانع با استفاده از تابع ایجاد می شود pthread_barrier_init():

#عبارتند از

pthread_barrier_init(pthread_barrier_t *barrier، const pthread_barrierattr_t *attr، تعداد int بدون علامت);

در نتیجه اجرای این کد، یک مانع در آدرس داده شده ایجاد می شود (اشاره گر به مانع در آرگومان مانع است) و با ویژگی های تعیین شده توسط آرگومان attr. آرگومان count تعداد رشته هایی را که باید تابع ()pthread_barrier_wait را فراخوانی کنند، مشخص می کند.

پس از ایجاد مانع، هر رشته تابع ()pthread_barrier_wait را فراخوانی می‌کند و به این ترتیب سیگنال تکمیل این عمل را نشان می‌دهد:

#عبارتند از

int pthread_barrier_wait(pthread_barrier_t "barrier);

وقتی یک رشته یک تابع را فراخوانی می کند pthread_barrier_wait()،تا تعداد رشته هایی که توسط تابع تنظیم شده است مسدود می شود pthread_barrier_init()، تابع را فراخوانی نمی کند pthread_jbarrier_wait()و بر این اساس مسدود نخواهد شد. پس از تعداد نخ های مشخص شده، تابع را فراخوانی کنید pthread_barrier_wait()، همه آنها قفل هستند همزمان.

#عبارتند از

#عبارتند از

#عبارتند از

#عبارتند از

pthread_barrier_t barrier; // شی همگام سازی از نوع "barrier"

main() // نادیده گرفتن آرگومان ها

time_t now;// یک مانع با مقدار شمارنده 3 ایجاد کنید

pthread_barrier_init(&barrier, NULL, 3); // شروع دو موضوع - threadl و thread2

pthread_create (NOLL، NOLL، threadl، NULL); // threadl و thread2 در حال اجرا هستند

pthread_create (NDLL، NDLL، thread2، NDLL)؛ // منتظر تکمیل

printf ("main() در انتظار مانع در %s"، ctime (&now));

pthread_barrier_wait (&barrier);// پس از این نقطه، هر سه رشته خاتمه می یابند

printf("موانع در mainO انجام شده در %s"، ctime (&now));

threadl (باطل *استفاده نشده)

ساعت هم اکنون)؛ // انجام محاسبات

printf ("threadl با %s شروع می شود"، ctime (&now))؛ // مکث

pthread_barrier_wait (&barrier) ;// پس از این نقطه هر سه رشته خاتمه می یابند

printf ("barrier in threadl() در %s انجام شد، ctime (&now)) ;

thread2 (void *not_used)

ساعت هم اکنون)؛ // انجام محاسبات

printf ("thread2 که از %s شروع می شود"، ctime (&now)); // مکث

pthread_barrier_wait(&barrier) ;

// بعد از این نقطه، هر سه رشته به پایان می رسد

printf ("barrier in thread2() در %s انجام شد، ctime (&now));

در مثال لیست، رشته اصلی یک مانع ایجاد می کند، پس از آن شروع به شمارش تعداد رشته های مسدود شده روی مانع برای همگام سازی می کند. در این حالت، تعداد رشته‌هایی که باید همگام‌سازی شوند به 3 تنظیم می‌شود: رشته ()main، رشته ()thread1 و رشته ()thread2.

رشته های thread1() و thread2() شروع می شوند. برای وضوح، یک مکث در موضوع برای شبیه سازی فرآیند محاسبه تنظیم می شود. برای انجام همگام‌سازی، نخ اصلی روی مانع مسدود می‌شود و منتظر می‌ماند تا پس از اینکه دو رشته دیگر آن را روی مانع نپیوستند، باز شود.



در انتظار مسدود شدن

قفل های خواب مانند متغیرهای شرطی، با چند استثنا، کار می کنند. و همچنین متغیرهای شرط در انتظار قفل ( pthread_sleepon_lock()) می تواند برای مسدود کردن یک رشته تا زمانی که یک شرط درست شود (مشابه تغییر مقدار یک مکان حافظه) استفاده شود. اما بر خلاف متغیرهای شرط (که باید برای هر شرطی که آزمایش می‌شود وجود داشته باشد)، قفل‌های معلق برای یک .m.tex منفرد و یک متغیر شرط ایجاد شده به صورت پویا، بدون توجه به تعداد شرایط مورد آزمایش اعمال می‌شوند. حداکثر تعداد متغیرهای شرط در نهایت برابر با حداکثر تعداد رشته های مسدود شده است.

TAU - تئوری کنترل خودکار

TS - سیستم فنی

سیستم عامل - شیء کنترلی

UU - دستگاه کنترل

SU - سیستم کنترل

IO - دستگاه اجرایی

IU - دستگاه اجرایی

D - سنسور

سیستم عامل - بازخورد

PC - نسبت دنده

TF - تابع انتقال

AFC - پاسخ فرکانس دامنه فاز

AFC - مشخصه دامنه فرکانس

LAFC - مشخصه دامنه-فرکانس لگاریتمی

PFC - پاسخ فرکانس فاز

2. قراردادها برای متغیرها و توابع اصلی

ایکس(تی) سیگنال ورودی عنصر CS، سیگنال خروجی سیستم عامل و CS (متغیر کنترل شده) است.

y(تی) سیگنال خروجی عنصر CS، سیگنال ورودی سیستم عامل (عمل کنترل) است.

ایکسساعت ( تی) عمل اصلی CS است

z(تی) اثر مزاحم بر سیستم کنترل است

(تی) یک سیگنال خطا (عدم تطابق) در CS است

1(تی) یک اقدام تک مرحله ای است

(تی) یک عمل تکانه است

ایکس متر ,y مترمقادیر دامنه سیگنال ها هستند ایکس(تی) و y(تی)

پ – عملگر لاپلاس، عملگر تمایز

 - فرکانس دایره ای، عملگر تبدیل فوریه

ایکس(پ) – تصویر سیگنال پیوسته ایکس(تی) به گفته لاپلاس

ایکس(j) - تصویر سیگنال پیوسته ایکس(تی) توسط فوریه

ک - پیوند رایانه (یا پیوند اتصالات)

دبلیو(پ) - PF یک پیوند (یا اتصال پیوندها)

دبلیو(j) - AFC یک پیوند (یا اتصال پیوندها)

ولی() - پاسخ فرکانسی پیوند (یا اتصال پیوندها)

() - PFC یک پیوند (یا اتصال پیوندها)

F( آر) PF یک سیستم کنترل بسته است

ساعت(تی) تابع انتقال (ویژگی) پیوند یا CS است

w(تی) تابع ضربه (وزن) (ویژگی) پیوند یا CS است

معرفی

تئوری کنترل خودکار (TAU)- یک رشته علمی که موضوع آن فرآیندهای اطلاعاتی است که در سیستم های کنترل اشیاء فنی و فناوری رخ می دهد. TAU الگوهای کلی عملکرد سیستم‌های خودکار با ماهیت فیزیکی مختلف را نشان می‌دهد و بر اساس این الگوها، اصولی را برای ساخت سیستم‌های کنترل با کیفیت بالا توسعه می‌دهد.

هنگام مطالعه فرآیندهای کنترل در TAU، از ویژگی های فیزیکی و طراحی سیستم ها انتزاع می شود و به جای سیستم های واقعی، مدل های ریاضی کافی آنها در نظر گرفته می شود. هرچه مدل ریاضی دقیق تر (کامل تر) با فرآیندهای فیزیکی رخ داده در یک سیستم واقعی مطابقت داشته باشد، سیستم کنترل طراحی شده کامل تر خواهد بود.

روش های اصلی تحقیق در TAU مدل سازی ریاضی، تئوری معادلات دیفرانسیل معمولی، حساب عملیاتی و تحلیل هارمونیک است. بیایید به طور خلاصه به هر یک از آنها توجه کنیم.

روش مدلسازی ریاضی، که طیف گسترده ای از روش ها و تکنیک ها را برای توصیف و نمایش اشیاء و پدیده های فیزیکی ترکیب می کند، می تواند به صورت مشروط و به صورت شماتیک با استفاده از متداول ترین تکنیک - نمایش گرافیکی یک شی ساده که دارای یک سیگنال ورودی است، نمایش داده شود. ایکس(تی) و یک سیگنال خروجی y(تی، به شکل یک مستطیل (شکل B. 1، ولی). سمبل ولیداخل مستطیل به معنای یک عملگر ریاضی (تابع، انتگرال و غیره) است که سیگنال های ورودی و خروجی را که در طول زمان تغییر می کنند، به هم متصل می کند.

برنج. در 1. نمایش شماتیک روش های ریاضی مورد استفاده در TAU

نظریه معادلات دیفرانسیل معمولیکه توجه خود را بر جنبه‌های فیزیکی و کاربردهای راه‌حل‌های به‌دست‌آمده متمرکز می‌کند، به عنوان مبنای روش‌شناختی اصلی TAU عمل می‌کند و معادلات دیفرانسیل معمولی خود کلی‌ترین و کامل‌ترین شکل توصیف ریاضی عناصر و سیستم‌های کنترل هستند. معادلات دیفرانسیل متغیرهای ورودی و خروجی متغیر با زمان و مشتقات آنها را به هم مرتبط می کند. در ساده ترین حالت، معادله دیفرانسیل شکل دارد

دو(تی)/dt=f[ایکس(تی),y(تی)]. (در 1)

روش حساب عملیاتیکه بر اساس تبدیل لاپلاس است

(در 2)

به شما امکان می دهد معادلات دیفرانسیل را جبری کنید - به معادلات به اصطلاح عملگر که تصاویر را پیوند می دهند بروید ایکس(پ) و Y(پ) سیگنال های ورودی و خروجی از طریق تابع انتقال دبلیو(پ) (شکل B. 1، ب)

دبلیو(پ)=Y(پ)/ایکس(پ). (در 3)

روش تحلیل هارمونیکبر اساس تبدیل فوریه شناخته شده از درس ریاضیات است که دارای شکل است

(در 4)

با استفاده از تبدیل فوریه (V. 4)، تصاویر پیدا می شوند ایکس(j) و Y(j) سیگنال های ورودی و خروجی ایکس(تی) و y(تی) مشخص کردن طیف فرکانس این سیگنال ها. تصاویر سیگنال فوریه متصل هستند (شکل B. 1، که در) تابع انتقال فرکانس

دبلیو(j) =Y(j)/X(j). (ساعت 5)

هر چهار روش که به طور خلاصه در بالا ارائه شده اند، دستگاه ریاضی TAU را تشکیل می دهند. بر اساس آن، مجموعه ای از روش های "خود" TAU، ارائه شده در این دوره، توسعه یافته است.

TAU همراه با تئوری ساخت و بهره برداری از عناصر سیستم های کنترل (حسگرها، تنظیم کننده ها، محرک ها) شاخه وسیع تری از علم - اتوماسیون را تشکیل می دهد. اتوماسیون نیز به نوبه خود یکی از شاخه های سایبرنتیک فنی است. سایبرنتیک فنی سیستم های کنترل فرآیند خودکار پیچیده (APCS) و شرکت ها (APCS) ساخته شده با استفاده از رایانه های کنترلی (CCM) را مطالعه می کند.

سایبرنتیک فنی به همراه سایبرنتیک بیولوژیکی و اجتماعی-اقتصادی جزء لاینفک سایبرنتیک است که بنیانگذار آن، ریاضیدان آمریکایی N. Wiener، در سال 1948 آن را به عنوان علم کنترل و ارتباطات در سیستم های فنی و موجودات زنده تعریف کرد.

اولین تنظیم کننده های صنعتی در دوره 1765-1804 ظاهر شدند. (I. Polzunov، J. Watt، J. Jaccard).

اولین مطالعات نظری تنظیم کننده ها در دوره 1868-1893 ظاهر شد. (J. Maxwell, I. Vyshnegradsky, A. Stodola). دانشمند و مهندس روسی I.A. Vyshnegradsky تعدادی مطالعات علمی انجام داد که در آن موتور بخار و تنظیم کننده آن برای اولین بار با روش های ریاضی به عنوان یک سیستم دینامیکی واحد تجزیه و تحلیل شدند. آثار A. A. Andronov، V. S. Kulebakin، I. N. Voznesensky، B. V. Bulgakov، A. A. Feldbaum، B. N. Petrov، N. N. Krasovsky، A. A. Voronova، Ya. Z. Tsypkina، V. S. Pugacheva، ...

توسعه تئوری کنترل مدرن از نظریه کنترل موسوم به "کلاسیک"، بر اساس چهار روش اساسی فوق الذکر برای مطالعه TAU، و شکل گیری آخرین روش های آن به صورت شماتیک در شکل 1 نشان داده شده است. در 2.

برنج. در 2. توسعه محتوا و روش شناسی تئوری کنترل

در حال حاضر، TAU همراه با آخرین بخش‌های تئوری کنترل عمومی (تحقیق در عملیات، مهندسی سیستم‌ها، نظریه بازی‌ها، تئوری صف)، نقش مهمی در بهبود و خودکارسازی کنترل فرآیندهای فناوری و تولید دارد.

برترین مقالات مرتبط