±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾Îļòµ¥ÃèÊöÁ˶àºËÏß³ÌÉÏÏÂÎÄÇл»ºÍÊôÐÔ£¬ÒÔ¼°ÓÃÀý×ÓʵÏÖÏ̵߳Ĵ´½¨£¬Ï£Íû¶ÔÄúµÄѧϰÓаïÖú¡£ |
|
Ò»£¬Ê²Ã´ÊÇÏß³Ì
Ïß³ÌÊǽø³ÌÖпÉÖ´ÐдúÂëÁ÷µÄÐòÁУ¬Ëü±»²Ù×÷ϵͳµ÷Ó㬲¢ÔÚ´¦ÀíÆ÷»òÄÚºËÉÏÔËÐС£ËùÓнø³Ì¶¼ÓÐÒ»¸öÖ÷Ị̈߳¬Ö÷Ïß³ÌÊǽø³ÌµÄ¿ØÖÆÁ÷»òÖ´ÐзÏß¡£Ï̷߳ÖΪÓû§Ï̺߳ÍϵͳỊ̈߳¬Ïß³ÌÔÚ´´½¨£¬Î¬»¤ºÍ¹ÜÀí·½Ãæ¸øÏµÍ³´øÀ´µÄ¸ºµ£ÒªÇáµÃ¶à¡£Ïß³ÌÓÃÓÚÖ´ÐÐϵͳÖеIJ¢·¢ÈÎÎñ£¬¿ÉÒÔ¼ò»¯ÏµÍ³ÖйÌÓеIJ¢·¢µÄ³ÌÐòµÄ½á¹¹¡£
Óû§¼¶Ï̺߳ÍÄں˼¶Ïß³Ì:
Ïß³ÌÓÐÈýÖÖʵÏÖÄ£ÐÍ£º Óû§¼¶»òÓ¦ÓóÌÐò¼¶£¬Äں˼¶£¬Óû§¼¶ºÍÄں˼¶»ìºÏÏ̡߳£
ËûÃÇÖ®¼äÖ÷ÒªµÄÇø±ðÔÚÓÚËûÃǵÄģʽÒÔ¼°ÒªÖ¸Åɸø´¦ÀíÆ÷µÄÏ̵߳ÄÄÜÁ¦¡£
Óû§Ä£Ê½Ï£¬Ïß³ÌפÁôÔÚÓû§¿Õ¼ä£¬ÊÇÖ´ÐгÌÐò»òÁ¬½Ó¿âÖеÄÖ¸ÁÓÉ¿âµ÷¶ÈÆ÷½øÐе÷¶È¡£
ÄÚºËģʽÏ£¬Ïß³ÌפÁôÔÚϵͳ¿Õ¼ä£¬¿ÉÒÔ½øÐÐϵͳµ÷Óã¬ÓɲÙ×÷ϵͳµ÷¶ÈÆ÷µ÷¶È¡£
Óû§Ïß³ÌÔÚÔËÐÐʱ£¬ÈÎÒâ¸ø¶¨Ê±¿Ì£¬Ã¿¸ö½ø³ÌÖ»ÓÐÒ»¸öÏß³ÌÔÚÔËÐУ¬¶øÇÒÖ»ÓÐÒ»¸ö´¦ÀíÆ÷Äں˱»·ÖÅ䏸¸Ã½ø³Ì¡£ÔËÐÐʱµ÷¶È¿â´Ó½ø³ÌµÄ¶à¸öÏß³ÌÖÐÑ¡ÔñÒ»¸ö£¬È»ºó¸ÃÏ̺߳ͽø³ÌÔÊÐíµÄÒ»¸öÄÚºËÏ̹߳ØÁªÆðÀ´£¬Óû§¼¶Ïß³ÌÊÇÒ»ÖÖ¶à¶ÔÒ»µÄÏß³ÌÓ³Éä¡£

Äں˼¶Ïß³ÌפÁôÔÚÄں˿ռ䣬ËüÃÇÊÇÄں˶ÔÏó£¬ÓɲÙ×÷ϵͳµ÷¶ÈÆ÷¹ÜÀí¡£ÓÐÁËÄÚºËỊ̈߳¬Ã¿¸öÓû§Ï̱߳»Ó³Éä»ò°ó¶¨µ½Ò»¸öÄÚºËÏ̡߳£
Óû§Ïß³ÌÔÚÆäÉúÃüÆÚÄÚ¶¼»á°ó¶¨µ½¸ÃÄÚºËÏ̡߳£Ò»µ©Óû§Ïß³ÌÖÕÖ¹£¬Á½Ï̶߳¼½«À뿪ϵͳ¡£´ÓÄÚºËÏ̵߳½Óû§Ïß³ÌÊÇÒ»ÖÖÒ»¶ÔÒ»Ó³Éä¡£

»ìºÏÏß³ÌÊÇÓû§Ï̺߳ÍϵͳÏ̵߳Ľ»²æ£¬Ê¹µÃÔËÐпâºÍ²Ù×÷ϵͳ¶¼¿ÉÒÔ¹ÜÀíÏ̡߳£ÔÚÕâÖÖʵÏÖÖнø³ÌÓÐ×Ô¼ºµÄÄÚºËÏ̳߳ء£¿ÉÔËÐеÄÓû§Ïß³ÌÓÉÔËÐÐʱ¿â·ÖÅɲ¢±ê¼ÇΪ׼±¸ºÃÖ´ÐеĿÉÓÃÏ̡߳£²Ù×÷ϵͳѡÔñÓû§Ï̲߳¢½«ËüÓ³Éäµ½Ï̳߳ØÖпÉÓõÄÄÚºËÏ̡߳£

Ï̵߳ÄÉÏÏÂÎÄ
²Ù×÷ϵͳ¹ÜÀíºÜ¶à½ø³ÌµÄÖ´ÐС£ËüÃÇÀ´×Ų»Í¬µÄ³ÌÐò»òϵͳ¡£µ±Ò»¸ö½ø³Ì´ÓÄÚºËÖÐÒÆ³ö£¬ÁíÒ»¸ö½ø³Ì³ÉΪ»î¶¯µÄ£¬ÕâЩ½ø³ÌÖ®¼ä±ã·¢ÉúÁËÉÏÏÂÎÄÇл»¡£²Ù×÷ϵͳ±ØÐë¼ÇÂ¼ÖØÆô½ø³ÌºÍÆô¶¯Ð½ø³Ìʹ֮»î¶¯ËùÐèÒªµÄËùÓÐÐÅÏ¢¡£Ïß³ÌÒ²ÓÐÏàͬµÄ´¦Àí·½Ê½¡£ÉÏÏÂÎı£´æµÄÄÚÈÝ¡£

¶þ£¬ Ï̺߳ͽø³ÌµÄ±È½Ï
Ï̺߳ͽø³Ì¶¼ÄÜÌṩ²¢·¢µÄ³ÌÐòÖ´ÐУ¬ÔÚ¾ö¶¨Ê¹Óýø³Ì»òÏß³Ìʱ¿ÉÒÔ´ÓÉÏÏÂÎÄÇл»¿ªÏú£¬ÍÌÍÂÁ¿£¬ÊµÌå¼äͨÐÅ£¬³ÌÐò¼ò»¯µÈ·½Ãæ½øÐп¼ÂÇ¡£
- ÉÏÏÂÎÄÇл»£ºÈç¹ûÖ»ÓÐÒ»¸ö´¦ÀíÆ÷£¬Ï̵߳ÄÉÏÏÂÎÄÇл»µÄ¿ªÏú½ÏС¡£
- ÍÌÍÂÁ¿£ºÊ¹Óöà¸öÏ߳̿ÉÒÔÔö¼Ó³ÌÐòµÄÍÌÍÂÁ¿£¬·ñÔòÖ»ÓÐÒ»¸öÏß³Ìʱ£¬Ï̵߳ÄIO½«Ê¹Õû¸ö³ÌÐò±»×èÈû¡£
- ʵÌå¼äͨÐÅ£ºÏß³ÌÓëͬһ½ø³Ì¼äÆäËûÏß³ÌͨÐÅʱ²»ÒªÇóÌØÊâµÄͨÐÅ»úÖÆ£¬¿ÉÒÔÖ±½Ó½øÐÐÊý¾ÝµÄ´«Êä¡£½ø³Ì¼äÔò±ØÐ뽨Á¢ºÍά»¤ËüÃÇÖ®¼äµÄͨÐÅ»úÖÆ¡£
- ÆÆ»µ½ø³ÌµÄÊý¾Ý£ºÏ߳̿ÉÒÔºÜÇáËÉµÄÆÆ»µÕû¸ö½ø³ÌµÄÊý¾Ý¡£½ø³ÌÓÐ×Ô¼ºµÄµØÖ·¿Õ¼ä£¬Ï໥¸ôÀ룬Êý¾ÝÒ²Êܵ½±£»¤¡£
- ɾ³ýÕû¸ö½ø³Ì£ºÏ̳߳ö´íʱ¿ÉÒÔµ¼ÖÂÕû¸ö½ø³ÌµÄÖÕÖ¹£¬Ëüµ¼ÖµĴíÎóÍùÍù±È½ø³Ìµ¼ÖµĴíÎó´ú¼Û¸ü´ó¡£
- ÖØÓÃÐÔ£ºÏß³ÌÒÀÀµÓÚ½ø³Ì£¬²»ÄÜ´ÓËüËùÊôµÄ½ø³Ì·ÖÀ룬²»¿ÉÒÔÖ±½Ó±»ÖØÓ㬽ø³ÌÔò¸ü¼ÓµÄ¶ÀÁ¢¡£

Èý£¬ ÉèÖÃÏß³ÌÊôÐÔ
ÓÐЩÏ̵߳ÄÐÅÏ¢¿ÉÒÔÃèÊöÏ̵߳ÄÉÏÏÂÎÄÇл»£¬ÕâЩÐÅÏ¢¿ÉÒÔÓÃÓÚÖØ½¨Ï̵߳Ļ·¾³¡£
ͬһ½ø³ÌÖв»Í¬Ï̵߳ÄÖ÷񻂿±ðÊÇ id£¬¶¨ÒåÏß³Ì״̬µÄ¼Ä´æÆ÷×飬ÓÅÏȼ¶ºÍÕ»¡£
POSIX¶¨ÒåÁËÏß³ÌÊôÐÔ¶ÔÏó£¬Ëü·â×°ÁËÏß³ÌÊôÐÔµÄÒ»¸ö×Ó¼¯£¬Ê¹Óû§¿ÉÒÔ·½±ãµÄ´´½¨·ÃÎʺ͸ü¸Ä¡£
- ¾ºÕù·¶Î§ £¨ÏµÍ³·¶Î§£¬½ø³Ì·¶Î§£©
- Õ»´óС
- Õ»µØÖ·
- ·ÖÀë״̬ £¨ÊÇ·ñ´ÓËüµÄ´´½¨ÕßÖзÖÀë³öÀ´£¬ÔÚÖÕÖ¹»òÍ˳öʱÊÇ·ñͬÆäËû¶ÔµÈÏ̻߳òÖ÷Ïß³Ìͬ²½£©
- ÓÅÏȼ¶
- µ÷¶È²ßÂԺͲÎÊý
ËÄ£¬ Ï̵߳Ľṹ
Óë½ø³ÌÒ»Ñù£¬Ïß³ÌÒ²ÓÐ×Ô¼ºµÄÉÏÏÂÎĺÍÊôÐÔ¡£½ø³ÌÓдúÂë¶Î£¬Êý¾Ý¶ÎºÍÕ»¶Î£¬Ïß³Ìͬ½ø³Ì¹²Ïí´úÂë¶ÎºÍÕ»¶Î¡£½ø³Ìͨ³£´ÓÄÚ´æµÄ¸ßµØÖ·¿ªÊ¼£¬ÏòÏÂÔö³¤£¬Ïß³ÌÔòÒÔÏÂÒ»¸öÏ߳̿ªÊ¼µÄµØÖ·Îª±ß½ç¡£

Ïß³ÌÓÐןͽø³ÌÒ»ÑùµÄ״̬ºÍ״̬ת»»¹ØÏµ¡£Ö÷Ï߳̿ÉÒÔ¾ö¶¨Õû¸ö½ø³ÌµÄ״̬¡£¶ÔÓÚ¶à¸öÏ̵߳Ľø³Ì£¬Ö»ÓÐËùÓеÄÏ̶߳¼´¦ÓÚÐÝÃß״̬Õû¸ö½ø³Ì²Å´¦ÓÚÐÝÃß״̬¡£
Ïß³ÌÔÚϵͳÖÐÓÐ×ÅÁ½ÖÖ¾ºÕù·¶Î§£º½ø³Ì¾ºÕùºÍϵͳ¾ºÕù¡£
½ø³Ì¾ºÕù£ºÏß³ÌÓëÏàͬ½ø³ÌÄ򵀮äËûÏ߳̽øÐоºÕù¡£
ϵͳ¾ºÕù£ºÏß³ÌÓëϵͳ·¶Î§ÄڵĽø³ÌµÄÏ߳̽øÐоºÕù¡£
¾ÙÀý£º½ø³ÌAÓÐ4¸öỊ̈߳¬½ø³ÌBÓÐ2¸öỊ̈߳¬ÏµÍ³ÓÐ8¸öCPU£¬½ø³ÌAµÄǰ3¸öÏß³ÌʹÓÃCPU 0£¬1
ÔÚ½ø³Ì·¶Î§ÄÚ¾ºÕù¡£½ø³ÌBµÄÒ»¸öÏ̺߳ͽø³ÌAµÄÒ»¸öÏ̹߳«ÓÃÒ»¸öCPU£¬ÔÚϵͳ·¶Î§ÄÚ½øÐоºÕù¡£

ÓÉÓÚ¾ºÕù£¬Ïß³ÌÒ²ÓÐ×ÅÏà¹ØµÄµ÷¶È²ßÂÔ¡£½ø³ÌµÄµ÷¶È²ßÂÔºÍÓÅÏȼ¶ÊôÓÚÖ÷Ï̡߳£Ã¿¸öÏ߳̿ÉÒÔÓÐןÍÖ÷Ï̲߳»Í¬µÄµ÷¶È²ßÂÔºÍÓÅÏȼ¶¡£
µ÷¶È²ßÂÔ·ÖΪÂÖѯ(RR)ºÍÏȽøÏȳö(FIFO)Á½ÖÖ¡£
Î壬 ´´½¨Ïß³Ì
ÏÂÃæ½«ÓÃÒ»¸ö¼òµ¥µÄʾÀýÀ´ËµÃ÷Ï̵߳Ĵ´½¨ºÍ¹ÜÀíµÄ·½Ê½¡£
ÕâÖÖʱÐòͼ¿ÉÒԽϺõÄÃèÊöÏß³ÌµÄÆô¶¯ºÍÖÕÖ¹µÄʱ¼äÉϵĹØÏµ¡£

ÏÂÃæµÄ³ÌÐò½«´´½¨Ò»¸ö¶àÏßÊý×飬²¢Ê¹ÆäÔËÐÐ
Áù£¬ ¹ÜÀíÏß³Ì
ÕâÀォ½éÉÜpthreadÖйØÓÚÏ̹߳ÜÀíµÄһЩº¯ÊýºÍ¹ÜÀí·½Ê½¡£
(1) ´´½¨Ïß³Ì
int
pthread_create(pthread_t* restrict thread, const
pthread_attr_t *restrict attr, void*(*start_routine),
void *restrict arg) |
pthread_t* restrict thread: ÃèÊöÏß³ÌID
const pthread_attr_t *restrict attr: ÐÂÏ̵߳ÄרÓÐÊôÐÔ£¬Èç¹ûÉèÖÃΪNULLÔòʹÓÃĬÈÏÖµ
void*(*start_routine): ÐÂÏ߳̽«ÒªÖ´ÐеÄÖ¸ÁÊý
void *restrict arg: Ö¸ÁÊýÐèÒªµÄ²ÎÊý
¹Ø¼ü×Örestrict: Óë֮ǰµÄIEEE±ê×¼±£³ÖÒ»ÖÂ
(2) ½áºÏÏß³Ì
int
pthread_join(pthread_t thread, void** value_ptr) |
ÓÃÓÚ½áºÏ»òÔٴνáºÏ½ø³ÌÖеĿØÖÆÁ÷£¬pthread_joinµ÷Óý«µ¼Öµ÷ÓÃÏß³ÌÖ´ÐÐ¹ÒÆð£¬Ö±µ½Ä¿±êÏß³ÌÖÕÖ¹¡£ËüÀàËÆÓÚ½ø³ÌÖеÄwait()º¯Êý£¬¸Ãº¯ÊýÓÉÏ̵߳Ĵ´½¨Õßµ÷Ó㬸õ÷ÓÃÏ̵߳ȴýÐÂÏß³ÌÖÕÖ¹²¢·µ»Ø£¬È»ºóÔٴνáºÏµ½µ÷ÓÃÏ̵߳ĿØÖÆÁ÷ÖС£Èç¹ûÏ߳̿ØÖƾä±ú¿ÉÒÔ¹«¹²·ÃÎÊ£¬¸Ãº¯ÊýÒ²¿ÉÒÔ±»¶ÔµÈÏ̵߳÷Óá£Ê¹µÃÈκÎÏ߳̿ÉÒÔ½«¿ØÖÆÁ÷ͬ½ø³ÌÖеÄÈÎºÎÆäËûÏ߳̽áºÏ¡£Èç¹ûµ÷ÓÃÏß³ÌÔÚÄ¿±êÏ̷߳µ»ØÇ°±»È¡Ïû£¬Ôò»áµ¼ÖÂÄ¿±êÏ̳߳ÉΪ½©ËÀÏ̡߳£
pthread_t thread: ÃèÊöÏß³ÌID
void** value_ptr: Èç¹ûÄ¿±êÏ̷߳µ»Ø³É¹¦£¬¸Ã²ÎÊý±£´æÏ̵߳ÄÍ˳ö״̬¡£
(3) »ñµÃÏß³ÌID
pthead_t
pthread_self(void) |
Ï̱߳»´´½¨ºó£¬¸Ãº¯Êý·µ»ØÏß³ÌID¡£
(4) ÖÕÖ¹Ïß³Ì
Ïß³ÌÖÕÖ¹·½Ê½£º
- ͨ¹ý´ÓËü±»·ÖÅäµÄÈÎÎñ·µ»Ø
- ÏÔʾÖÕÖ¹×ÔÉí²¢Ìṩһ¸öÍ˳ö״̬
- ±»ÏàͬµØÖ·¿Õ¼äµÄÆäËûÏß³ÌÖÕÖ¹
×ÔÖÕÖ¹£ºint pthread_exit(void** value_ptr)
µ±ÖÕÖ¹Ï̵߳÷ÓÃpthread_exit()ºó£¬ËüÔÚ value_ptrÖеõ½¸ÃÏ̵߳ÄÍ˳ö״̬¡£Í˳ö״̬±»·µ»Øµ½pthread_joinÖС£µ±µ÷ÓÃÕâ¸öº¯Êýʱ£¬Ïß³ÌËùʹÓõÄ×ÊÔ´²»»á±»ÊÍ·Å¡£
ÖÕÖ¹¶ÔµÈỊ̈߳ºint pthread_cancel(pthread_t thread)
Ó¦ÓóÌÐòÖпÉÄÜÓÐÏ̼߳àÊÓÆäËûÏ̵߳Ť×÷£¬Èç¹û·¢ÏÖÓеÄÏß³ÌÖ´Ðв»Á¦»ò²»ÔÙÐèҪʱ£¬ÓбØÒªÊ¹ÆäÖÕÖ¹¡£pthread_cancleµÄµ÷ÓÃÊÇÈ¡ÏûÒ»¸ö¶ÔµÈÏ̵߳ÄÇëÇó¡£Õâ¸öÇëÇó¿ÉÄÜÁ¢¿Ì±»Í¬Ò⣬ÉÔºó±»Í¬Ò⣬ÉõÖÁ±»ºöÂÔ¡£Ä¿±êÏ߳̿ÉÄÜÁ¢¿ÌÖÕÖ¹£¬ÉÔºóÖÕÖ¹£¬»ò¾Ü¾øÖÕÖ¹¡£
ÔÚÈ¡ÏûÒ»¸ö¶ÔµÈÏ̵߳ÄÇëÇó±»Í¬Òâʱ£¬»áÓÐÒ»¸öÈ¡Ïû¹ý³Ì£¬Ä¿±êÏ̵߳ÄÈ¡Ïû״̬£¨¿ÉÈ¡Ïû or ²»¿ÉÈ¡Ïû£©ºÍ
È¡ÏûÀàÐÍ£¨È¡ÏûºÎʱ·¢Éú£©¾ö¶¨ÁËÊÕµ½È¡ÏûÇëÇóºóÏ̼߳ÌÐøÖ´ÐеÄÄÜÁ¦¡£
ÉèÖÃÈ¡Ïû״̬ºÍÈ¡ÏûÀàÐÍ£º
pthread_setcancelstate(int
stat, int *oldstat);
pthread_setcanceltype(int type, int* oldtype); |
ʹÓÃÈ¡Ïûµã
µ±ÍƳÙÈ¡ÏûÇëÇóʱ£¬Ï̵߳ÄÖÕÖ¹»áÍÆ³Ùµ½Ï̵߳ĺ¯ÊýÖ´ÐкóÆÚ¡£µ±È¡Ïû·¢Éúʱ£¬Ó¦¸ÃÊǰ²È«µÄ£¬ÒòΪËü²»´¦ÓÚ»¥³âÁ¿¼ÓËø£¬Ö´Ðйؼü´úÂ룬ÁîÊý¾Ý´¦ÓÚijÖÖ²»¿ÉÓÃ״̬µÄÇé¿öÖС£´úÂëÖ´ÐÐÖУ¬ÕâЩλÖÃÊǺܺõÄÈ¡Ïûµã¡£È¡ÏûµãÊÇÒ»¸ö¼ì²éµã£¬Ïß³ÌÔÚÕâÀï¼ì²éÊÇ·ñÓÐÈκÎÈ¡ÏûÇëÇóδ¾ö£¬Èç¹ûÓУ¬ÔòÖÕÖ¹¡£
void
pthread_testcancel(void); |
ÁíÍâ¿ÉÀûÓð²È«È¡ÏûµÄ¿âº¯ÊýºÍϵͳµ÷ÓÃ
-
pthread_cond_wait()
- pthread_timewait()
- pthread_join() |
µ±Ïß³ÌÒòµ÷ÓÃÕâЩº¯Êý¶ø×èÈûʱ£¬È¡ÏûÏß³ÌÊǰ²È«µÄ¡£
(4) ¹ÜÀíÏß³ÌÕ»
int
pthread_attr_setstacksize( pthread_attr_t *attr,
size_t stacksize);
int pthread_attr_getstacksize( pthread_attr_t
*attr, size_t *stacksize);
int pthread_attr_setstackaddr( pthread_attr_t
*attr, void *stackaddr);
int pthread_attr_getstackaddr(
pthread_attr_t *attr, void **stackaddr);
int pthread_attr_setstack(pthread_attr_t *attr,
void *stackaddr, size_t stacksize);
int pthread_attr_getstack(pthread_attr_t *attr,
void **stackaddr, size_t *stacksize); |
(5) ¹ÜÀíÏ̵߳÷¶ÈºÍÓÅÏȼ¶
int
pthread_attr_setinheritsched(pthread_attr_t
*attr, int inheritsched);
int pthread_attr_getinheritsched(pthread_attr_t
*attr, int *inheritsched);
int pthread_attr_setschedpolicy(pthread_attr_t
*attr, int policy);
int pthread_attr_getschedpolicy(pthread_attr_t
*attr,int *policy);
int pthread_attr_setschedparam(pthread_attr_t
*attr,const struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t
*attr,struct sched_param *param); |
(6) ¹ÜÀíÏ߳̾ºÕù·¶Î§
int
pthread_attr_setscope(pthread_attr_t *attr,
int contentionscope);
int pthread_attr_getscope(const pthread_attr_t
*restrict attr, int *restrict contentionscope); |
Æß£¬ À©Õ¹Ï߳̽ӿÚ
Ï̵߳ĽӿÚÀཫ°ÑÏ̹߳ÜÀíµÈ¹¦ÄܽøÐзâ×°£¬Ê¹µÃÏ̸߳üÒ×ʹÓ㬹¦ÄܸüÇ¿£¬Ò²¸ü¼ÓÁé»î¡£
³ÌÐò¹²4²¿·Ö£º
thread_object.h£º¶¨Òå½Ó¿ÚÀà¡£
thread_object.cpp£º½Ó¿ÚÀàµÄʵÏÖ
thread_filter.cpp£ºÅÉÉú×Ô½Ó¿ÚÀà»ùÀ࣬ʵÏÖ¼òµ¥µÄ²âÊÔ¹¦ÄÜ¡£
main.cpp£º²âÊÔÈë¿Ú³ÌÐò¡£
thread_object.h
#ifndef __THREAD_OBJECT_H
#define __THREAD_OBJECT_H
using namespace
std;
#include <iostream>
#include <pthread.h>
#include <string>
class thread_object
{
public:
thread_object();
~thread_object();
void setPriority(int nPriority);
void setSchedPolicy(int nPolicy);
void setContentionScope(int nScope);
void setDetached(void);
void setJoinable(void);
void name(string strName);
void run(void);
void join(void);
friend void *thread(void *buff);
private:
pthread_t m_Tid;
protected:
virtual void do_something(void) = 0;
pthread_attr_t m_attr_SchedAttr;
struct sched_param m_attr_SchedParam;
string m_Name;
int m_nNewPolicy;
int m_nNewState;
int m_nNewScope;
};
class filter_thread: public thread_object
{
protected:
void do_something(void);
public:
filter_thread(void);
~filter_thread(void);
};
|
thread_object.cpp
#include
"thread_object.h"
thread_object::thread_object()
{
pthread_attr_init(&m_attr_SchedAttr);
pthread_attr_setinheritsched(&m_attr_SchedAttr,
PTHREAD_EXPLICIT_SCHED);
m_nNewState = PTHREAD_CREATE_JOINABLE;
m_nNewScope = PTHREAD_SCOPE_PROCESS;
m_nNewPolicy = SCHED_OTHER;
}
thread_object::~thread_object()
{
}
void thread_object::join(void)
{
if (m_nNewState == PTHREAD_CREATE_JOINABLE)
{
pthread_join(m_Tid, NULL);
}
}
void thread_object::setPriority(int nPriority)
{
int nPolicy;
struct sched_param
stParam;
stParam.sched_priority = nPriority;
pthread_attr_setschedparam(&m_attr_SchedAttr,
&stParam);
}
void thread_object::setSchedPolicy(int nPolicy)
{
if (nPolicy == 1)
{
pthread_attr_setschedpolicy(&m_attr_SchedAttr,
SCHED_RR);
pthread_attr_getschedpolicy(&m_attr_SchedAttr,
&m_nNewPolicy);
}
if (nPolicy == 2)
{
pthread_attr_setschedpolicy(&m_attr_SchedAttr,
SCHED_FIFO);
pthread_attr_getschedpolicy(&m_attr_SchedAttr,
&m_nNewPolicy);
}
}
void thread_object::setContentionScope(int nScope)
{
if (nScope == 1)
{
pthread_attr_setscope(&m_attr_SchedAttr,
PTHREAD_SCOPE_SYSTEM);
pthread_attr_getscope(&m_attr_SchedAttr,
&m_nNewScope);
}
if (nScope == 2)
{
pthread_attr_setscope(&m_attr_SchedAttr,
PTHREAD_SCOPE_PROCESS);
pthread_attr_getscope(&m_attr_SchedAttr,
&m_nNewScope);
}
}
void thread_object::setDetached(void)
{
pthread_attr_setdetachstate(&m_attr_SchedAttr,
PTHREAD_CREATE_DETACHED);
pthread_attr_getdetachstate(&m_attr_SchedAttr,
&m_nNewState);
}
void thread_object::setJoinable(void)
{
pthread_attr_setdetachstate(&m_attr_SchedAttr,
PTHREAD_CREATE_JOINABLE);
pthread_attr_getdetachstate(&m_attr_SchedAttr,
&m_nNewState);
}
void thread_object::run(void)
{
pthread_create(&m_Tid, &m_attr_SchedAttr,
thread, this);
}
void thread_object::name(string strName)
{
m_Name = strName;
}
void* thread(void* buff)
{
thread_object*
pThread;
pThread = static_cast<thread_object *>
(buff);
pThread->do_something();
return NULL;
} |
thread_filter.cpp
<pre
name="code" class="cpp">#include
"thread_object.h"
filter_thread::filter_thread(void)
{
pthread_attr_init(&m_attr_SchedAttr);
}
filter_thread::~filter_thread(void)
{}
void filter_thread::do_something(void)
{
struct sched_param
stParam;
int nPolicy;
pthread_t thread_id = pthread_self();
string strSchedule;
string strState;
string strScope;
pthread_getschedparam(thread_id, &nPolicy,
&stParam);
switch (m_nNewPolicy)
{
case SCHED_RR:
strSchedule.assign("RR");
break;
case SCHED_FIFO:
strSchedule.assign("FIFO");
break;
case SCHED_OTHER:
strSchedule.assign("OTHER");
break;
default:
strSchedule.assign("unknown");
break;
}
switch (m_nNewState)
{
case PTHREAD_CREATE_DETACHED:
strState.assign("DETACHED");
break;
case PTHREAD_CREATE_JOINABLE:
strState.assign("JOINABLE");
break;
default:
strState.assign("unknown");
break;
}
switch (m_nNewScope)
{
case PTHREAD_SCOPE_PROCESS:
strScope.assign("PROCESS");
break;
case PTHREAD_SCOPE_SYSTEM:
strScope.assign("SYSTEM");
break;
default:
strScope.assign("unknown");
}
cout << m_Name << " : "
<< thread_id << endl
<< "--------------------------------------"<<
endl
<< " priority : " << stParam.sched_priority
<< endl
<< " policy : " << strSchedule
<< endl
<< " state : " << strState
<< endl
<< " scope : " << strScope
<< endl << endl;
} |
main.cpp
#include
"thread_object.h"
#include <unistd.h>
int main(int argc, char * argv[])
{
filter_thread MyThread[4];
MyThread[0].name("Proteus");
MyThread[0].setSchedPolicy(2);
MyThread[0].setPriority(7);
//MyThread[0].setDetached(); // ÈôÉèÖÃΪDetachedÔòÔÚ´òӡʱ»á³öÏÖÂÒÐòÏÖÏó
MyThread[1].name("Stand Along Complex");
MyThread[1].setContentionScope(1);
MyThread[1].setPriority(5);
MyThread[1].setSchedPolicy(2);
MyThread[2].name("Krell Space");
MyThread[2].setPriority(3);
MyThread[3].name("Cylon Space");
MyThread[3].setSchedPolicy(2);
MyThread[3].setPriority(2);
for (int i = 0; i < 4; i++)
{
MyThread[i].run();
MyThread[i].join();
}
return 0;
} |
|