Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
C++¶àºË¸ß¼¶±à³Ì
 
  4484  次浏览      27
 2018-10-24
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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;

}

   
4484 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì