רצח בדם קר

vinney

Well-known member
רצח בדם קר

אני רוצה לרצוח thread שיצרתי עם CreateThread, לפני שהוא מגיע לסיומו. איך אני יכול לעשות את זה? תודה
 

ברנדל

New member
TerminateThread

אבל אני מקווה בשבילך שלא תעשה את זה. אם אתה בתוך ה thread אתה יכול להתאבד עם ExitThread גם את זה אני מקווה שלא תעשה. הדרך הכי טובה זה להרים flag מחוץ ל thread. הלולאה שרצה ב thread בודקת בכל איטרציה האם ה flag הורם, אם כן נעשה break ללואה והיציאה מה thread היא בצורה מסודרת (כלומר פועלים ה dtors של האוביקטים שהקצית ב stack של ה thread , או כל נקיון אחר) דבר שנמנע ממך בשימוש בפונקציות ה api שהראתי בהתחלה. בהצלחה
 

ברנדל

New member
ועוד משהו

עשה לעצמך טובה ואל תיצור thread עם CreateThread, אלא רק עם beginthreadex (או שאל תתפלא אם יהיו לך באגים לא צפויים כתוצאה משימוש בפונציות runtime של c שלא לקחו בחשבון תכנות multythreading ושמרו מידע במשתנים גלובליים)
 

gilad_no

New member
לאו דווקא

צריך פשוט להקפיד לקמפל את היישום ביחד עם CRT של MT (וכמובן לדעת לכתוב קוד נכון...)
 

DadleFish

New member
שתי הערות חשובות

1. אל תשתמש ב-CreateThread, אלא ב-beginthreadex. אם אתה רוצה לדעת למה, חפש בספר של ג'פרי ריכטר (Programming windows applications). אם אין לך, תקנה. מומלץ. 2. אתה יכול להשתמש ב-TerminateThread, אבל אם אתה רוצה שהתוכנה תמשיך לרוץ, אל תעשה את זה. עדיף להודיע ל-Thread שזמנו תם ושייצא בכוחות עצמו. יש סיבה מסוימת שבגללה אתה לא יכול לעשות את זה?
 
נצל"ש ../images/Emo6.gif

קטע קוד מפרוייקט בקורס מערכות הפעלה שכתבתי בסמסטר הקודם:
// Kill the specified thread. If handle is 0, commit suicide. // By the way, murder/suicide is not the right way to go. There // is always another solution. int t_kill(T_HANDLE handle) { // prevent pre-emption WaitForSingleObject(in_sysfunc,0); if( handle == 0 ) { // commit suicide exec->set_state(TS_KILLED); SetEvent(sync_object); ReleaseMutex(in_sysfunc); while( true ); } else if ((*threads)[handle] == NULL ) { // sorry, only live creatures can be killed ReleaseMutex(in_sysfunc); return RC_ERROR; } else { // murder the poor thread Thread* t = (*threads)[handle]; t->set_state(TS_KILLED); ReleaseMutex(in_sysfunc); return RC_OK; } }​
שימו לב להערות
 
אל תשימו לב...

לשאר המחדלים שיש לי פה (כמו זה שאני לא בודק חריגה ממערך או ערכים חוזרים מפונקציות API וכו')
 

vinney

Well-known member
../images/Emo51.gif רבה לכוווווווווולכם

נראה לי אני אלך על הרעיון של לדגום דגל כל הזמן תוך כדי הפעלת הthread, הבעיה במקרה כזה היא שבין הדלגת דגל לבין הסיום העצמי של הthread בפועל עובר פרק זמן לא ידוע מראש, אני מקווה שזה לא יהרוס לי....
 

DadleFish

New member
שים לב למשהו קריטי,

אופטימיזציות של הקומפיילר עשויות להביא לכך שה-THREAD לא יסתיים לעולם. זאת מכיוון שהדגל אינו משתנה בתוך ה-THREAD עצמו (אלא בד"כ מתוך THREAD אחר) - והקומפיילר עשוי להניח שמכיוון שאינו משתנה בתוך ה-THREAD, הוא אינו משתנה לעולם, ולכן תבוצע אופטימיזציה ובמקום הדגל יהיה שם פשוט true - מה שיוביל לתקיעה של ה-THREAD. ראשית עליך להגדיר את הדגל בתור volatile - בשביל זה בדיוק קיימת ה-keyword הזו. שנית, הייתי מקציב ל-thread זמן מסוים לרדת, ואם הוא לא מציית - להשתמש ב-TerminateThread. כשאני מוריד thread אני בד"כ משתמש ב-WaitForSingleObject על ה-Handle של ה-Thread - כשהוא יורד, ה-Handle שלו נהפך להיות signaled ו-WFSO יחזיר לך WAIT_OBJECT_0.
 

selalerer

New member
חשבתי שvolatile מבקש מהקומפיילר

לשמור את המשתנה, כמה שיותר זמן באוגר כי הוא "הפכפך" כלומר משתנה לעיתים קרובות וכך אפשר לשפר מהירות. האם טעות בידי?
 

DadleFish

New member
להיפך.

מתוך MSDN (לא ש-MSDN הוא האורים והתומים של ה-Keywords אבל מילא) :
The volatile keyword is a type qualifier used to declare that an object can be modified in the program by something such as the operating system, the hardware, or a concurrently executing thread. ... Objects declared as volatile are not used in optimizations because their value can change at any time. The system always reads the current value of a volatile object at the point it is requested, even if the previous instruction asked for a value from the same object. Also, the value of the object is written immediately on assignment.​
 

DadleFish

New member
מה שאתה מדבר עליו, אגב,

הוא register - ולפחות CL לא ממש מתייחס להוראה כזו מצד התוכניתן.
 

selalerer

New member
לפי דעתי, זה אפילו הוסבר לי פה כבר

פעם אחת. הזכרון שלי לא מספיר ברור בכדי להיות בטוח והחיפוש (או אולי עדיף שנקרא לו איבוד) של תפוז, בטח לא יכול לעזור לי בנושא.
 
למעלה