Forwarded from Sisoog مرجع متن باز الکترونیک-سیسوگ
📌انواع پروتکل های شبکه و اینترنت (بخش اول) | قسمت هشتم مفاهیم شبکه و اینترنت در راهاندازی ماژول ESP8266
👈#سیسوگ
🖋 نویسنده: #حمیدرضا_روشنی
⏱ مدت مطالعه: 10 دقیقه
💭 مقدمه
از این که هفت قسمت با من همراه بودید، بسیار خوشحال هستم و امیدوارم تا اینجا خسته نشده باشید. شاید پیش خودتون بگید “عنوان این مقاله با محتوای این هشت قسمت فرق داره! چرا باید این مطالب را بخونم؟!” در جواب باید بگم شاید در ظاهر مطالب هفت قسمت گذشته و حتی این قسمت ربطی به ماژول ESP8266 نداشته باشند؛ ولی موقع راهاندازی و استفاده از این ماژول حتماً به موارد توضیح داده شده در این فصول برخواهید خورد و باید معانی و مفهوم اونها را بدونید.
✍️ خلاصه کلی
توی این قسمت سعی کردم هر نوع پروتکلی که (تا زمان نوشتن این مقاله) در شبکه محلی و یا شبکه اینترنت استفاده میشند و اسم اونها را زیاد میشنوید و در راه اندازی ESP8266 بدرد میخورند را توضیح بدم. البته این ماژول فقط چند پروتکل (اصلی و مهم) را پشتیبانی میکنه ولی سعی کردم خیلی جامعتر توضیح بدم.
⚠️ مطلب بالا، تنها خلاصه و کلیتی از اصل مقاله است، مقاله کامل را می توانید در وب سایت سیسوگ (ادامه مطلب) مطالعه فرمایید.
👈🏻 ادامه مطلب
📣 عضویت در کانال تلگرام سیسوگ
👈#سیسوگ
🖋 نویسنده: #حمیدرضا_روشنی
⏱ مدت مطالعه: 10 دقیقه
💭 مقدمه
از این که هفت قسمت با من همراه بودید، بسیار خوشحال هستم و امیدوارم تا اینجا خسته نشده باشید. شاید پیش خودتون بگید “عنوان این مقاله با محتوای این هشت قسمت فرق داره! چرا باید این مطالب را بخونم؟!” در جواب باید بگم شاید در ظاهر مطالب هفت قسمت گذشته و حتی این قسمت ربطی به ماژول ESP8266 نداشته باشند؛ ولی موقع راهاندازی و استفاده از این ماژول حتماً به موارد توضیح داده شده در این فصول برخواهید خورد و باید معانی و مفهوم اونها را بدونید.
✍️ خلاصه کلی
توی این قسمت سعی کردم هر نوع پروتکلی که (تا زمان نوشتن این مقاله) در شبکه محلی و یا شبکه اینترنت استفاده میشند و اسم اونها را زیاد میشنوید و در راه اندازی ESP8266 بدرد میخورند را توضیح بدم. البته این ماژول فقط چند پروتکل (اصلی و مهم) را پشتیبانی میکنه ولی سعی کردم خیلی جامعتر توضیح بدم.
⚠️ مطلب بالا، تنها خلاصه و کلیتی از اصل مقاله است، مقاله کامل را می توانید در وب سایت سیسوگ (ادامه مطلب) مطالعه فرمایید.
👈🏻 ادامه مطلب
📣 عضویت در کانال تلگرام سیسوگ
سیسوگ
انواع پروتکل های شبکه و اینترنت (بخش اول) | قسمت هشتم مفاهیم شبکه و اینترنت در راهاندازی ماژول ESP8266 - سیسوگ
نواع پروتکلهایی که به طریقی شما با آنها در کار با شبکه یا وب سروکار خواهید داشت در اینجا بهصورت دستهبندیشده توضیح میدهیم.
Stuff for Geeks
مقداری سوکت پروگرمینگ در لینوکس قسمت دوم خب تا اینجا فهمیدیم که باید یه سوکت بسازیم (با تابع socket) و بعد از اون اگه کلاینت هستیم تابع connect و اگه سرور هستیم تابع bind رو با یه آدرس مناسب (یه متغیر از جنس sockaddr_in) صدا بزنیم تا سوکتمون که صرفا یه فایله،…
مقداری سوکت پروگرمینگ در لینوکس
قسمت سوم
بسیارخب
سوکت کلاینت رو ساختیم و به آیپی و پورت مدنظرمون وصلش کردیم. حالا چجوری میتونیم دیتا بفرستیم؟
خب گفتیم که یه سوکت یه ابسترکشن لیره که باعث میشه یه فایل داشته باشیم که با نوشتن و خوندن ازش بتونیم دیتا رو ارسال و دریافت کنیم.
پس باید بتونیم مستقیم با سیستمکال های write و read دیتا رو بفرستیم و بخونیم.
جواب اینه که بله کاملا درسته. میتونیم
ولی یه سری کمبودها داریم اینجوری. درواقع چون این توابع برای نوشتن و خوندن توی فایلهای معمولی نوشته شدن، قابلیتهای اضافهای که توی پروتکلهای tcp یا پروتکلهای لایههای پایین ترش وجود دارن رو دیگه نداریم.
مثلا ما میتونیم یه فلگ MSG_DONTROUTE داشته باشیم که وقتی فعالش کنیم، دیتامون سمت gateway نره و مستقیم به سیستمهایی که توی لنمون هستن ارسال بشه یا فلگ های فراوان دیگه ای.
به همین دلیل چندتا تابع مخصوص ارسال و دریافت دیتا روی سوکتها داریم.
دوتای معروفشون send و recv هستن و مدلهایی که تابحال استفاده نکردم، sendto و sendmsg و recvfrom و recvmsg هستن که یه مقدار قابلیتهای بیشتری دارن.
پروتوتایپ تابع send به شکل زیر هست:
فک میکنم مشخصه که چه پارامترهایی باید به این تابع بدیم. اول از همه فایل دیسکریپتور سوکتمون رو میدیم، بعد یه پوینتر به دیتایی که قراره ارسال کنیم، سایز این دیتا و نهایتا فلگهایی که لازم داریم(مثلا همون فلگی که باعث میشد روتینگ نداشته باشیم).
این تابع تعداد بایتهایی که تونسته ارسال کنه رو بر میگردونه
دقت کنین که اگه فلگ رو صفر بدیم، عملا این تابع با تابع write هیچ فرقی نخواهد داشت!
برای دریافت دیتا هم تابع recv رو داریم که تقریبا شبیه send تعریف میشه:
اینجا هم پارامترها همون قبلیان، فقط چیزی که تابع برمیگردونه تعداد بایتهایی که تونسته بخونه.
کلاینتمون اینجا تموم میشه و سرور میمونه که توی پستهای بعدی بهش خواهیم پرداخت
ادامه دارد:)
#Linux
#Programming
#Network
قسمت سوم
بسیارخب
سوکت کلاینت رو ساختیم و به آیپی و پورت مدنظرمون وصلش کردیم. حالا چجوری میتونیم دیتا بفرستیم؟
خب گفتیم که یه سوکت یه ابسترکشن لیره که باعث میشه یه فایل داشته باشیم که با نوشتن و خوندن ازش بتونیم دیتا رو ارسال و دریافت کنیم.
پس باید بتونیم مستقیم با سیستمکال های write و read دیتا رو بفرستیم و بخونیم.
جواب اینه که بله کاملا درسته. میتونیم
ولی یه سری کمبودها داریم اینجوری. درواقع چون این توابع برای نوشتن و خوندن توی فایلهای معمولی نوشته شدن، قابلیتهای اضافهای که توی پروتکلهای tcp یا پروتکلهای لایههای پایین ترش وجود دارن رو دیگه نداریم.
مثلا ما میتونیم یه فلگ MSG_DONTROUTE داشته باشیم که وقتی فعالش کنیم، دیتامون سمت gateway نره و مستقیم به سیستمهایی که توی لنمون هستن ارسال بشه یا فلگ های فراوان دیگه ای.
به همین دلیل چندتا تابع مخصوص ارسال و دریافت دیتا روی سوکتها داریم.
دوتای معروفشون send و recv هستن و مدلهایی که تابحال استفاده نکردم، sendto و sendmsg و recvfrom و recvmsg هستن که یه مقدار قابلیتهای بیشتری دارن.
پروتوتایپ تابع send به شکل زیر هست:
ssize_t send(int sockfd, const void* buffer, size_t len, int flags)
فک میکنم مشخصه که چه پارامترهایی باید به این تابع بدیم. اول از همه فایل دیسکریپتور سوکتمون رو میدیم، بعد یه پوینتر به دیتایی که قراره ارسال کنیم، سایز این دیتا و نهایتا فلگهایی که لازم داریم(مثلا همون فلگی که باعث میشد روتینگ نداشته باشیم).
این تابع تعداد بایتهایی که تونسته ارسال کنه رو بر میگردونه
دقت کنین که اگه فلگ رو صفر بدیم، عملا این تابع با تابع write هیچ فرقی نخواهد داشت!
برای دریافت دیتا هم تابع recv رو داریم که تقریبا شبیه send تعریف میشه:
ssize_t recv(int sockfd, const void* buffer, size_t len, int flags)
اینجا هم پارامترها همون قبلیان، فقط چیزی که تابع برمیگردونه تعداد بایتهایی که تونسته بخونه.
کلاینتمون اینجا تموم میشه و سرور میمونه که توی پستهای بعدی بهش خواهیم پرداخت
ادامه دارد:)
#Linux
#Programming
#Network
🔥1
Forwarded from ویکی تجربه - استخدام و بررسی شرکت ها
میدونستی اگه بخوای تو یه کشور اروپایی دنبال کار بگردی، اون شرکتی که براش اپلای میکنی باید ویزای کاریِ تو رو اسپانسر کنه تا بتونی به راحتی و بدون دردسر به اون کشور مهاجرت کنی؟
حالا حساب کن اگه اون شرکت، ریلوکیشن پکیج هم داشته باشه که دیگه چی از این بهتر 😇
یعنی چی؟
یعنی هزینه ی بلیط هواپیما، اجاره خونه برای یک یا دوماه اول و بقیه ی هزینه های حمایتیِ دیگه برای شروع زندگی تو یه کشور جدید رو پرداخت کنه، یه کمک و پشتوانه ی خیلی قوی برات محسوب بشه و دغدغه ها و نگرانیهای تو رو برای استارت زندگی جدیدت تا حد زیادی برطرف کنه.
از طرفی هممون میدونیم لینکدین یکی از قویترین سایتها در زمینهی کاریابیِ بین المللی هست؛ ولی خیلی از موقعیتهای شغلی معرفی شده توسط لینکدین، #نیروی_لوکال میخواد و در نتیجه دلیل خیلی از ریجکتی هایی که پیش میاد اینه که تو اون کشور نیستی.
بچه ها وبسایت #ریلوکیشن_جابز همه ی این نیازها رو مرتفع میکنه.
این وبسایت فوق العاده کاربردی هست و با موتور جستجوی قدرتمندی که داره، شبانه روزی در حال بررسی این موقعیتها هست و به محض پیدا شدن یه موقعیتی که ویزا اسپانسر میکنه و ریلوکیشن پکیج میده، اون رو برات لیست میکنه که بتونی بهش دسترسی پیدا کنی.
همچنین موقعیت های ریموت جهان که امکان کار با ایرانی ها رو داره هم تو این وب سایت براتون لیست میشه
✅ در حال حاضر موقعیت رشتههای نرم افزار و برنامه نویسی در شاخه های فرانت اند ، بکند ، دواپس، دیتا ساینس، مارکتینگ ، سئو ، طراحی محصول ، مدیریت محصول، مهندسی برق ، مهندسی سخت افزار ، مهندسی مکانیک ، مهندسی صنایع، حسابداری و امور مالی و ده ها رشته ی دیگه که ریلوکیشن پکیج میدن رو داره که هر روز داره تو این سایت لیست میشه.
https://relocationjobs.org
حالا حساب کن اگه اون شرکت، ریلوکیشن پکیج هم داشته باشه که دیگه چی از این بهتر 😇
یعنی چی؟
یعنی هزینه ی بلیط هواپیما، اجاره خونه برای یک یا دوماه اول و بقیه ی هزینه های حمایتیِ دیگه برای شروع زندگی تو یه کشور جدید رو پرداخت کنه، یه کمک و پشتوانه ی خیلی قوی برات محسوب بشه و دغدغه ها و نگرانیهای تو رو برای استارت زندگی جدیدت تا حد زیادی برطرف کنه.
از طرفی هممون میدونیم لینکدین یکی از قویترین سایتها در زمینهی کاریابیِ بین المللی هست؛ ولی خیلی از موقعیتهای شغلی معرفی شده توسط لینکدین، #نیروی_لوکال میخواد و در نتیجه دلیل خیلی از ریجکتی هایی که پیش میاد اینه که تو اون کشور نیستی.
بچه ها وبسایت #ریلوکیشن_جابز همه ی این نیازها رو مرتفع میکنه.
این وبسایت فوق العاده کاربردی هست و با موتور جستجوی قدرتمندی که داره، شبانه روزی در حال بررسی این موقعیتها هست و به محض پیدا شدن یه موقعیتی که ویزا اسپانسر میکنه و ریلوکیشن پکیج میده، اون رو برات لیست میکنه که بتونی بهش دسترسی پیدا کنی.
همچنین موقعیت های ریموت جهان که امکان کار با ایرانی ها رو داره هم تو این وب سایت براتون لیست میشه
✅ در حال حاضر موقعیت رشتههای نرم افزار و برنامه نویسی در شاخه های فرانت اند ، بکند ، دواپس، دیتا ساینس، مارکتینگ ، سئو ، طراحی محصول ، مدیریت محصول، مهندسی برق ، مهندسی سخت افزار ، مهندسی مکانیک ، مهندسی صنایع، حسابداری و امور مالی و ده ها رشته ی دیگه که ریلوکیشن پکیج میدن رو داره که هر روز داره تو این سایت لیست میشه.
https://relocationjobs.org
Forwarded from HuntLearn
ویدئو ورکشاپ سرویسهانتینگ؛ به تدریس مهندس رضا شریف زاده در یوتیوب آپلود شد! منتظر حمایت شما عزیزان هستیم🙏🏼
https://www.youtube.com/watch?v=BegoBUg5NiU
https://www.youtube.com/watch?v=BegoBUg5NiU
YouTube
ورکشاپ سرویس هانتینگ! به تدریس مهندس رضا شریف زاده
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.
❤1
Forwarded from #root@hack (𝙍𝙄𝘾𝙃Δ𝙍𝘿)
📦Курсы по реверс инжинирингу от ILLEGAL7
содержание курса:
Advanced software cracking
Cracker Tools 2.8
Dotnet Software Reverse Engineering And Static Analysis Course
Ransomware virus course
Reverse Engineering Course
Software Cracking Course
🔗 ссылка на скачивание
пароль: Theillegalhacker7@@@
содержание курса:
Advanced software cracking
Cracker Tools 2.8
Dotnet Software Reverse Engineering And Static Analysis Course
Ransomware virus course
Reverse Engineering Course
Software Cracking Course
пароль: Theillegalhacker7@@@
Please open Telegram to view this post
VIEW IN TELEGRAM
https://github.com/XDeadHackerX/NetSoc_OSINT/blob/main/README-English.md
Social media osint tool
#OSINT
#Tool
Social media osint tool
#OSINT
#Tool
GitHub
NetSoc_OSINT/README-English.md at main · XDeadHackerX/NetSoc_OSINT
Tool focused on extracting information from an account in different Social Networks / Herramienta enfocada a extraer información de una cuenta en diversas Redes Sociales, SIN usar nuestra Cuenta, N...
دوستان متاسفانه دیگه فعالیت نخواهیم داشت😔
این کانال هم داشته باشید به عنوان آخرین پست کانال(حداقل از طرف بنده)
https://www.youtube.com/@iotwithiman/
پلی لیست کامل آموزش STM32 و سیستم های کنترل دیجیتال
این کانال هم داشته باشید به عنوان آخرین پست کانال(حداقل از طرف بنده)
https://www.youtube.com/@iotwithiman/
پلی لیست کامل آموزش STM32 و سیستم های کنترل دیجیتال
YouTube
IoT with Iman
I am Iman. I have investigated the Internet of Things systems for years and have become a full-stack developer: Designing the hardware, develop the device, connect it to a server, and providing its data to an end-user. I am here to share everything I've learned…
💔4
برای آموزش QML هم Downloadly یه سری دوره از Udemy آپلود کرده با عناوین
Qt6 and Qml for begginers
Qt6 and Qml for Intermediate
Qt6 and Qml for Advanced
بنظرم خوب هستن
#cpp
#qt
#programming
Qt6 and Qml for begginers
Qt6 and Qml for Intermediate
Qt6 and Qml for Advanced
بنظرم خوب هستن
#cpp
#qt
#programming
❤2
همزمانی در سیپلاسپلاس
پست یک
خب سیپلاسپلاس و stl یه مجموعه کاملی برای concurrency دارن.
مهم ترینش شاید بشه گفت کلاس std::thread باشه که ریسورسای لازم یک ثرد رو از سیستم عامل میگیره. فرض کنین بخوایم یه تابع رو به شکل همزمان اجرا کنیم شکل کلی برنامه اینجوری میشه:
نکته های خیلی زیادی داره این چندخط که سعی میکنم چندتاشو بگم
۱) یه آبجکت ثرد به محض ساخته شدن، شروع به اجرا میکنه و با stl تاجایی که بنده میدونم نمیتونیم ثردی که از اول ساسپند شده بسازیم
۲) بعد از اینکه به آبجکت از std::thread میسازیم، یا باید joinاش رو صدا کنیم تا ثرد اصلی تا موقع تموم شدن کارش صبر کنه یا detach رو صدا کنیم تا ثرد بره توی پس زمینه اجراشه (کنترل ثرد بیوفته دست کتابخانه رانتایم cpp).
حالا سوال اینه اگه جوین یا دیتچ رو صدا نکنیم چه اتفاقی میوفته؟
اتفاقای بد
خیلی بد😂
۳) توی دیستراکتور thread، اگه یه ثرد جوین یا دیتچ نشده باشه، تابع std::terminate صدا زده میشه که کلا برنامه رو میبنده پس حتما باید قبل از ازبین رفتن آبجکت یکی از ایندوتا تابع رو صدا بزنیم. (یکی از جاهایی که مهمه حواسمون به این نکته باشه، وقتیه که بین ساختن آبجکت و جوین یا دیتچ کردنش یه کد داشته باشیم که exception تولید کنه اینجورجاها بهتره از std::jthread استفاده کنیم. توضیحش خارج از این پسته)
۴) یه ثرد وقتی join یا detachاش صدا زده میشه، تابع std::thread::joinable اش دیگه تا ابد false برمیگردونه. دلیلش سادست. اگه join رو صدا زده باشیم و بعدش joinable رو، قاعدتا تا ثرد تموم نشه، به joinable نمیرسیم و وقتی برسیم ثرد تموم شده و دیگه وجود نداره که بخوایم جوینش کنیم. اگه دیتچ کرده باشیم هم یه ثرد داریم که دیگه دست ما نیست کنترلش و کلا هیچ کنترلی روش نخواهیم داشت. پس باز هم منطقیه که joinable فالس برگردونه.
درواقع دیستراکتور std::thread هم از همین تابع استفاده میکنه تا چک کنه ببینه باید terminate کنه یا نه
۵) اگه تابعی که قراره به صورت همزمان اجرا بشه یه سری متغیر ورودی داشته باشه، توی std::thread این متغیرا رو پاس میدیم ولی باید حواسمون باشه که متغیرها کپی خواهند شد. حتی اگه رفرنس باشن🥸
این یه سری نکته داره که ایشالا بعدا میگم
ادامه
#programming
#cpp
#concurrency
پست یک
خب سیپلاسپلاس و stl یه مجموعه کاملی برای concurrency دارن.
مهم ترینش شاید بشه گفت کلاس std::thread باشه که ریسورسای لازم یک ثرد رو از سیستم عامل میگیره. فرض کنین بخوایم یه تابع رو به شکل همزمان اجرا کنیم شکل کلی برنامه اینجوری میشه:
#include <thread>
void someConcurrentFunction(){}
int main(){
auto th=std::thread(someFunction);
th.join(); //or th.detach()
}
نکته های خیلی زیادی داره این چندخط که سعی میکنم چندتاشو بگم
۱) یه آبجکت ثرد به محض ساخته شدن، شروع به اجرا میکنه و با stl تاجایی که بنده میدونم نمیتونیم ثردی که از اول ساسپند شده بسازیم
۲) بعد از اینکه به آبجکت از std::thread میسازیم، یا باید joinاش رو صدا کنیم تا ثرد اصلی تا موقع تموم شدن کارش صبر کنه یا detach رو صدا کنیم تا ثرد بره توی پس زمینه اجراشه (کنترل ثرد بیوفته دست کتابخانه رانتایم cpp).
حالا سوال اینه اگه جوین یا دیتچ رو صدا نکنیم چه اتفاقی میوفته؟
اتفاقای بد
خیلی بد😂
۳) توی دیستراکتور thread، اگه یه ثرد جوین یا دیتچ نشده باشه، تابع std::terminate صدا زده میشه که کلا برنامه رو میبنده پس حتما باید قبل از ازبین رفتن آبجکت یکی از ایندوتا تابع رو صدا بزنیم. (یکی از جاهایی که مهمه حواسمون به این نکته باشه، وقتیه که بین ساختن آبجکت و جوین یا دیتچ کردنش یه کد داشته باشیم که exception تولید کنه اینجورجاها بهتره از std::jthread استفاده کنیم. توضیحش خارج از این پسته)
۴) یه ثرد وقتی join یا detachاش صدا زده میشه، تابع std::thread::joinable اش دیگه تا ابد false برمیگردونه. دلیلش سادست. اگه join رو صدا زده باشیم و بعدش joinable رو، قاعدتا تا ثرد تموم نشه، به joinable نمیرسیم و وقتی برسیم ثرد تموم شده و دیگه وجود نداره که بخوایم جوینش کنیم. اگه دیتچ کرده باشیم هم یه ثرد داریم که دیگه دست ما نیست کنترلش و کلا هیچ کنترلی روش نخواهیم داشت. پس باز هم منطقیه که joinable فالس برگردونه.
درواقع دیستراکتور std::thread هم از همین تابع استفاده میکنه تا چک کنه ببینه باید terminate کنه یا نه
۵) اگه تابعی که قراره به صورت همزمان اجرا بشه یه سری متغیر ورودی داشته باشه، توی std::thread این متغیرا رو پاس میدیم ولی باید حواسمون باشه که متغیرها کپی خواهند شد. حتی اگه رفرنس باشن🥸
این یه سری نکته داره که ایشالا بعدا میگم
ادامه
#programming
#cpp
#concurrency
Stuff for Geeks
همزمانی در سیپلاسپلاس پست یک خب سیپلاسپلاس و stl یه مجموعه کاملی برای concurrency دارن. مهم ترینش شاید بشه گفت کلاس std::thread باشه که ریسورسای لازم یک ثرد رو از سیستم عامل میگیره. فرض کنین بخوایم یه تابع رو به شکل همزمان اجرا کنیم شکل کلی برنامه اینجوری…
همزمانی در سیپلاسپلاس
پست ۲
تو این پست میخوام در مورد مشکلی که آخر پست یک بهش اشاره شد، بگم. مشکلی که ما با پاس دادن متغیر به std::thread که یه کانستراکتور هست، داریم. فرض کنید که یه تابع مثل زیر داریم و میخوایم اون رو به std::thread پاس بدیم:
خب حالا فرض کنید یه ثرد با این تابع بسازیم:
این کد مشکل ساز خواهد بود
هرچند که اینجا کار میکنه، ولی در ادامه میبینیم که این کد مشکلات بزرگی داره
دلیلش اینه که متنی که داخل دابل کوت قرار داره، یه آبجکت استرینگ نیست و درحقیقت یه
درواقع someFunction یه استرینگ میگیره ولی متد std::thread یه سری ورودی میگیره که جنسشون ربطی به اینکه جنس پارامترهای someFunction چیه نداره. پس اینجا به مشکل میخوریم. مشکل وقتی جدی میشه که پارامتری که داریم به std::thread پاس میدیم، یه پوینتر اتوماتیک باشه که از اسکوپ خارج شده باشه ولی ثرد بهش نیاز داشته باشه. اینجاست که کدمون خطری میشه.
راه حل چیه؟
راه حل اینه که واضحا به کامپایلر بگیم که میخوایم استرینگ پاس بدیم. کد زیر، کد درسته:
همین قضیه برای رفرنس برقراره. البته ایندفعه کامپایلر ارور میده. مثلا کد زیر، خطای کامپایل خواهد داشت:
اینجا هم باید به کامپایلر واضح بگیم که باید رفرنس پاس بده. برای اینکار باید از std::ref استفاده کنیم که یه wrapper برای reference هست:
و کد کامپایل خواهد شد.
ادامه
#programming
#cpp
#concurrency
پست ۲
تو این پست میخوام در مورد مشکلی که آخر پست یک بهش اشاره شد، بگم. مشکلی که ما با پاس دادن متغیر به std::thread که یه کانستراکتور هست، داریم. فرض کنید که یه تابع مثل زیر داریم و میخوایم اون رو به std::thread پاس بدیم:
void someFunction(std::string someString){
//some processing
}خب حالا فرض کنید یه ثرد با این تابع بسازیم:
int main(){
std::thread th(someFunction, "some string");
th.join();
return 0;
}این کد مشکل ساز خواهد بود
هرچند که اینجا کار میکنه، ولی در ادامه میبینیم که این کد مشکلات بزرگی داره
دلیلش اینه که متنی که داخل دابل کوت قرار داره، یه آبجکت استرینگ نیست و درحقیقت یه
cons char* عه.درواقع someFunction یه استرینگ میگیره ولی متد std::thread یه سری ورودی میگیره که جنسشون ربطی به اینکه جنس پارامترهای someFunction چیه نداره. پس اینجا به مشکل میخوریم. مشکل وقتی جدی میشه که پارامتری که داریم به std::thread پاس میدیم، یه پوینتر اتوماتیک باشه که از اسکوپ خارج شده باشه ولی ثرد بهش نیاز داشته باشه. اینجاست که کدمون خطری میشه.
راه حل چیه؟
راه حل اینه که واضحا به کامپایلر بگیم که میخوایم استرینگ پاس بدیم. کد زیر، کد درسته:
int main(){
std::thread th(someFunction, std::string("some string"));
th.join();
return 0;
}همین قضیه برای رفرنس برقراره. البته ایندفعه کامپایلر ارور میده. مثلا کد زیر، خطای کامپایل خواهد داشت:
void foo(int& someRef){
//...
}
int main(){
int i=10;
std::thread th(foo, i);
th.join();
return 0;
}اینجا هم باید به کامپایلر واضح بگیم که باید رفرنس پاس بده. برای اینکار باید از std::ref استفاده کنیم که یه wrapper برای reference هست:
void foo(int& someRef){
//...
}
int main(){
int i=10;
std::thread th(foo, std::ref(i));
th.join();
return 0;
}و کد کامپایل خواهد شد.
ادامه
#programming
#cpp
#concurrency
Simplified designing of analog and digital filters, op-amps and amplifiers and more:
https://youtube.com/@adanner
https://youtube.com/@adanner
A great channel
C/C++ Programming
OpenGL and SDL2/3
SFML
Design Patterns
and much more
https://www.youtube.com/@MikeShah
C/C++ Programming
OpenGL and SDL2/3
SFML
Design Patterns
and much more
https://www.youtube.com/@MikeShah
YouTube
Mike Shah
Teaching computer Science, primarily Modern C++, C, DLang, games, and computer graphics programming
I'm a teaching professor and Senior 3D Graphics Engineer who has worked in industry at various games and graphics companies.
Access Full Courses: courses.mshah.io…
I'm a teaching professor and Senior 3D Graphics Engineer who has worked in industry at various games and graphics companies.
Access Full Courses: courses.mshah.io…
Stuff for Geeks
همزمانی در سیپلاسپلاس پست ۲ تو این پست میخوام در مورد مشکلی که آخر پست یک بهش اشاره شد، بگم. مشکلی که ما با پاس دادن متغیر به std::thread که یه کانستراکتور هست، داریم. فرض کنید که یه تابع مثل زیر داریم و میخوایم اون رو به std::thread پاس بدیم: void som…
همزمانی در سیپلاسپلاس
پست ۳
تو این پست میخوام درمورد std::jthread که از C++17 به stl اضافه شده یه صبحتی بکنیم.
این کلاس یه خاصیت خوب داره:
توی دیستراکتورش، چک میکنه اگه ثرد جوین نشده بود جوینش میکنه.
چرا این خاصیت خوبه؟
چون ما معمولا یه ثرد که میسازیم، چندین خط بعد جوین یا دیتچش میکنم و به همین دلیل ممکنه بین ساختنش تا جوین شدنش اکسپشن رخ بده یا اتفاقای دیگه که باعث شده ثرد جوین نشه. و همونطور که قبلا گفتیم، اگه یه ثرد عادی (std::thread) جوین نشه و دیستراکتورش صدا زده بشه، برنامه کامل بسته میشه(std::terminate).
پس خوبه که بجای std::thread که توی C++11 اضافه شد، از std::jthread استفاده کنیم.
ادامه
#cpp
#programming
#comcurrency
پست ۳
تو این پست میخوام درمورد std::jthread که از C++17 به stl اضافه شده یه صبحتی بکنیم.
این کلاس یه خاصیت خوب داره:
توی دیستراکتورش، چک میکنه اگه ثرد جوین نشده بود جوینش میکنه.
چرا این خاصیت خوبه؟
چون ما معمولا یه ثرد که میسازیم، چندین خط بعد جوین یا دیتچش میکنم و به همین دلیل ممکنه بین ساختنش تا جوین شدنش اکسپشن رخ بده یا اتفاقای دیگه که باعث شده ثرد جوین نشه. و همونطور که قبلا گفتیم، اگه یه ثرد عادی (std::thread) جوین نشه و دیستراکتورش صدا زده بشه، برنامه کامل بسته میشه(std::terminate).
پس خوبه که بجای std::thread که توی C++11 اضافه شد، از std::jthread استفاده کنیم.
ادامه
#cpp
#programming
#comcurrency
Stuff for Geeks
همزمانی در سیپلاسپلاس پست ۳ تو این پست میخوام درمورد std::jthread که از C++17 به stl اضافه شده یه صبحتی بکنیم. این کلاس یه خاصیت خوب داره: توی دیستراکتورش، چک میکنه اگه ثرد جوین نشده بود جوینش میکنه. چرا این خاصیت خوبه؟ چون ما معمولا یه ثرد که میسازیم،…
همزمانی در سیپلاسپلاس
پست ۴
خب
حالا که چندین ثرد داریم، اگه خواسته باشیم یه حافظهای بین اینا به اشتراک بذاریم(shared_momry) باید چیکار کنیم؟
تعداد زیادی از مشکلات و مباحث همزمانی از اینجا شروع میشه.
مشکل اول، race condition:
یه مثال معروفی هست برای اینکه بفهمیم این مشکل چیه. فرض کنید رفتین سینما یا تئاتر و دهتا از مسئولین سالن دارن برای هر صندلی بلیت میفروشن. (صندلیها میشن shared memory و ماموران فروش میشن ثردها)
حالا اینجا مشکل اولی که پیش میاد اینه که اگه ماموران فروش خوب هماهنگ نشده باشن، ممکنه یه صندلی رو به دو یا چندتانفر بفروشن که قاعدتا کار اشتباهیه
اینجا هم همین مشکل هست
فرض کنید دوتا ثرد بخوان به عددی که تو یه خونه از حافظه هست رو بخونن(read) و مقدارش رو یک واحد اضافه کنن(write).
این مورد هم توجه داشته باشید که دیتا متاسفانه کش میشه. ینی از مموری اصلی(رم) خونده میشه و تا یه مدت کوتاهی توی سی پی یو هست.
حالا فرض کنید مقداری که توی حافظه هست عدد ده باشه.
ثرد یک این مقدار رو میخونه(۱۰) و این مقدار خونده شده میاد تو کش.
میاد یکی بهش اضافه کنه ولی تا بخواد اضافه کنه، ثرد دو چون همزمان داره اجرا میشه، ممکنه بیاد و بخواد عملیات خوندن رو انجام بده و چون توی کش مقدار ده رو داریم، عدد ده رو خواهد خوند. بعد هر ثرد یکی اضافه میکنن به این مقدار که میشه یازده و توی مموری مینویسنش.
انتظارمون این بود به عدد دوازده توی مموری برسیم(چون دوتا ثرد هرکدوم داشتن به یه متغیر یه واحد اضافه میکردن) ولی ممکنه به عدد یازده هم برسیم.
برای رفع این مشکل ساختارهای متفاوتی در سطح نرمافزاری و سخت افزاری داریم. در سطح نرمافزاری یا دقیق تر سیستم عاملی، mutex و semaphore و در سطح سختافزاری atomic operation ها رو داریم که در ادامه بررسی خواهند شد
ادامه
#programming
#cpp
#comcurrency
پست ۴
خب
حالا که چندین ثرد داریم، اگه خواسته باشیم یه حافظهای بین اینا به اشتراک بذاریم(shared_momry) باید چیکار کنیم؟
تعداد زیادی از مشکلات و مباحث همزمانی از اینجا شروع میشه.
مشکل اول، race condition:
یه مثال معروفی هست برای اینکه بفهمیم این مشکل چیه. فرض کنید رفتین سینما یا تئاتر و دهتا از مسئولین سالن دارن برای هر صندلی بلیت میفروشن. (صندلیها میشن shared memory و ماموران فروش میشن ثردها)
حالا اینجا مشکل اولی که پیش میاد اینه که اگه ماموران فروش خوب هماهنگ نشده باشن، ممکنه یه صندلی رو به دو یا چندتانفر بفروشن که قاعدتا کار اشتباهیه
اینجا هم همین مشکل هست
فرض کنید دوتا ثرد بخوان به عددی که تو یه خونه از حافظه هست رو بخونن(read) و مقدارش رو یک واحد اضافه کنن(write).
این مورد هم توجه داشته باشید که دیتا متاسفانه کش میشه. ینی از مموری اصلی(رم) خونده میشه و تا یه مدت کوتاهی توی سی پی یو هست.
حالا فرض کنید مقداری که توی حافظه هست عدد ده باشه.
ثرد یک این مقدار رو میخونه(۱۰) و این مقدار خونده شده میاد تو کش.
میاد یکی بهش اضافه کنه ولی تا بخواد اضافه کنه، ثرد دو چون همزمان داره اجرا میشه، ممکنه بیاد و بخواد عملیات خوندن رو انجام بده و چون توی کش مقدار ده رو داریم، عدد ده رو خواهد خوند. بعد هر ثرد یکی اضافه میکنن به این مقدار که میشه یازده و توی مموری مینویسنش.
انتظارمون این بود به عدد دوازده توی مموری برسیم(چون دوتا ثرد هرکدوم داشتن به یه متغیر یه واحد اضافه میکردن) ولی ممکنه به عدد یازده هم برسیم.
برای رفع این مشکل ساختارهای متفاوتی در سطح نرمافزاری و سخت افزاری داریم. در سطح نرمافزاری یا دقیق تر سیستم عاملی، mutex و semaphore و در سطح سختافزاری atomic operation ها رو داریم که در ادامه بررسی خواهند شد
ادامه
#programming
#cpp
#comcurrency