ºìÁªLinuxÃÅ»§
Linux°ïÖú

LinuxϵĶàÏ̱߳à³Ì

·¢²¼Ê±¼ä:2010-01-25 17:45:50À´Ô´:ºìÁª×÷Õß:bolderson
1 ÒýÑÔ
¡¡¡¡¡¡¡¡Ị̈߳¨thread£©¼¼ÊõÔçÔÚ60Äê´ú¾Í±»Ìá³ö£¬µ«ÕæÕýÓ¦ÓöàÏ̵߳½²Ù×÷ϵͳÖÐÈ¥£¬ÊÇÔÚ80Äê´úÖÐÆÚ£¬solarisÊÇÕâ·½ÃæµÄٮٮÕß¡£´«Í³µÄUnixÒ²Ö§³ÖÏ̵߳ĸÅÄµ«ÊÇÔÚÒ»¸ö½ø³Ì£¨process£©ÖÐÖ»ÔÊÐíÓÐÒ»¸öỊ̈߳¬ÕâÑù¶àÏ߳̾ÍÒâζ×Ŷà½ø³Ì¡£ÏÖÔÚ£¬¶àÏ̼߳¼ÊõÒѾ­±»Ðí¶à²Ù×÷ϵͳËùÖ§³Ö£¬°üÀ¨Windows/NT£¬µ±È»£¬Ò²°üÀ¨Linux¡£
¡¡¡¡¡¡¡¡ÎªÊ²Ã´ÓÐÁ˽ø³ÌµÄ¸ÅÄîºó£¬»¹ÒªÔÙÒýÈëÏß³ÌÄØ£¿Ê¹ÓöàÏ̵߳½µ×ÓÐÄÄЩºÃ´¦£¿Ê²Ã´µÄϵͳӦ¸ÃÑ¡ÓöàỊ̈߳¿ÎÒÃÇÊ×ÏȱØÐë»Ø´ðÕâЩÎÊÌâ¡£
¡¡¡¡¡¡¡¡Ê¹ÓöàÏ̵߳ÄÀíÓÉÖ®Ò»ÊǺͽø³ÌÏà±È£¬ËüÊÇÒ»Öַdz£"½Ú¼ó"µÄ¶àÈÎÎñ²Ù×÷·½Ê½¡£ÎÒÃÇÖªµÀ£¬ÔÚLinuxϵͳÏ£¬Æô¶¯Ò»¸öеĽø³Ì±ØÐë·ÖÅä¸øËü¶ÀÁ¢µÄµØÖ·¿Õ¼ä£¬½¨Á¢ÖÚ¶àµÄÊý¾Ý±íÀ´Î¬»¤ËüµÄ´úÂë¶Î¡¢¶ÑÕ»¶ÎºÍÊý¾Ý¶Î£¬ÕâÊÇÒ»ÖÖ"°º¹ó"µÄ¶àÈÎÎñ¹¤×÷·½Ê½¡£¶øÔËÐÐÓÚÒ»¸ö½ø³ÌÖеĶà¸öỊ̈߳¬ËüÃDZ˴ËÖ®¼äʹÓÃÏàͬµÄµØÖ·¿Õ¼ä£¬¹²Ïí´ó²¿·ÖÊý¾Ý£¬Æô¶¯Ò»¸öÏß³ÌËù»¨·ÑµÄ¿Õ¼äԶԶСÓÚÆô¶¯Ò»¸ö½ø³ÌËù»¨·ÑµÄ¿Õ¼ä£¬¶øÇÒ£¬Ï̼߳ä±Ë´ËÇл»ËùÐèµÄʱ¼äҲԶԶСÓÚ½ø³Ì¼äÇл»ËùÐèÒªµÄʱ¼ä¡£¾Ýͳ¼Æ£¬×ܵÄ˵À´£¬Ò»¸ö½ø³ÌµÄ¿ªÏú´óÔ¼ÊÇÒ»¸öÏ߳̿ªÏúµÄ30±¶×óÓÒ£¬µ±È»£¬ÔÚ¾ßÌåµÄϵͳÉÏ£¬Õâ¸öÊý¾Ý¿ÉÄÜ»áÓнϴóµÄÇø±ð¡£
¡¡¡¡¡¡¡¡Ê¹ÓöàÏ̵߳ÄÀíÓÉÖ®¶þÊÇÏ̼߳䷽±ãµÄͨÐÅ»úÖÆ¡£¶Ô²»Í¬½ø³ÌÀ´Ëµ£¬ËüÃǾßÓжÀÁ¢µÄÊý¾Ý¿Õ¼ä£¬Òª½øÐÐÊý¾ÝµÄ´«µÝÖ»ÄÜͨ¹ýͨÐŵķ½Ê½½øÐУ¬ÕâÖÖ·½Ê½²»½ö·Ñʱ£¬¶øÇҺܲ»·½±ã¡£Ïß³ÌÔò²»È»£¬ÓÉÓÚͬһ½ø³ÌϵÄÏß³ÌÖ®¼ä¹²ÏíÊý¾Ý¿Õ¼ä£¬ËùÒÔÒ»¸öÏ̵߳ÄÊý¾Ý¿ÉÒÔÖ±½ÓΪÆäËüÏß³ÌËùÓã¬Õâ²»½ö¿ì½Ý£¬¶øÇÒ·½±ã¡£µ±È»£¬Êý¾ÝµÄ¹²ÏíÒ²´øÀ´ÆäËûһЩÎÊÌ⣬ÓеıäÁ¿²»ÄÜͬʱ±»Á½¸öÏß³ÌËùÐ޸ģ¬ÓеÄ×Ó³ÌÐòÖÐÉùÃ÷ΪstaticµÄÊý¾Ý¸üÓпÉÄܸø¶àÏ̳߳ÌÐò´øÀ´ÔÖÄÑÐԵĴò»÷£¬ÕâЩÕýÊDZàд¶àÏ̳߳ÌÐòʱ×îÐèҪעÒâµÄµØ·½¡£
¡¡¡¡¡¡¡¡³ýÁËÒÔÉÏËù˵µÄÓŵãÍ⣬²»ºÍ½ø³Ì±È½Ï£¬¶àÏ̳߳ÌÐò×÷ΪһÖÖ¶àÈÎÎñ¡¢²¢·¢µÄ¹¤×÷·½Ê½£¬µ±È»ÓÐÒÔϵÄÓŵ㣺
¡¡¡¡¡¡¡¡1) Ìá¸ßÓ¦ÓóÌÐòÏìÓ¦¡£Õâ¶ÔͼÐνçÃæµÄ³ÌÐòÓÈÆäÓÐÒâÒ壬µ±Ò»¸ö²Ù×÷ºÄʱºÜ³¤Ê±£¬Õû¸öϵͳ¶¼»áµÈ´ýÕâ¸ö²Ù×÷£¬´Ëʱ³ÌÐò²»»áÏìÓ¦¼üÅÌ¡¢Êó±ê¡¢²Ëµ¥µÄ²Ù×÷£¬¶øʹÓöàÏ̼߳¼Êõ£¬½«ºÄʱ³¤µÄ²Ù×÷£¨time consuming£©ÖÃÓÚÒ»¸öеÄỊ̈߳¬¿ÉÒÔ±ÜÃâÕâÖÖÞÏÞεÄÇé¿ö¡£
¡¡¡¡¡¡¡¡2) ʹ¶àCPUϵͳ¸ü¼ÓÓÐЧ¡£²Ù×÷ϵͳ»á±£Ö¤µ±Ïß³ÌÊý²»´óÓÚCPUÊýĿʱ£¬²»Í¬µÄÏß³ÌÔËÐÐÓÚ²»Í¬µÄCPUÉÏ¡£
¡¡¡¡¡¡¡¡3) ¸ÄÉƳÌÐò½á¹¹¡£Ò»¸ö¼È³¤ÓÖ¸´ÔӵĽø³Ì¿ÉÒÔ¿¼ÂÇ·ÖΪ¶à¸öỊ̈߳¬³ÉΪ¼¸¸ö¶ÀÁ¢»ò°ë¶ÀÁ¢µÄÔËÐв¿·Ö£¬ÕâÑùµÄ³ÌÐò»áÀûÓÚÀí½âºÍÐ޸ġ£
¡¡¡¡¡¡¡¡ÏÂÃæÎÒÃÇÏÈÀ´³¢ÊÔ±àдһ¸ö¼òµ¥µÄ¶àÏ̳߳ÌÐò¡£
¡¡¡¡
¡¡¡¡2 ¼òµ¥µÄ¶àÏ̱߳à³Ì
¡¡¡¡¡¡¡¡LinuxϵͳϵĶàÏß³Ì×ñÑ­POSIXÏ߳̽ӿڣ¬³ÆΪpthread¡£±àдLinuxϵĶàÏ̳߳ÌÐò£¬ÐèҪʹÓÃÍ·Îļþpthread.h£¬Á¬½ÓʱÐèҪʹÓÿâlibpthread.a¡£Ë³±ã˵һÏ£¬LinuxÏÂpthreadµÄʵÏÖÊÇͨ¹ýϵͳµ÷ÓÃclone£¨£©À´ÊµÏֵġ£clone£¨£©ÊÇLinuxËùÌØÓеÄϵͳµ÷Óã¬ËüµÄʹÓ÷½Ê½ÀàËÆfork£¬¹ØÓÚclone£¨£©µÄÏêϸÇé¿ö£¬ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔÈ¥²é¿´ÓйØÎĵµËµÃ÷¡£ÏÂÃæÎÒÃÇչʾһ¸ö×î¼òµ¥µÄ¶àÏ̳߳ÌÐòexample1.c¡£
¡¡¡¡
¡¡¡¡/* example.c*/
¡¡¡¡#include
¡¡¡¡#include
¡¡¡¡void thread(void)
¡¡¡¡{
¡¡¡¡int i;
¡¡¡¡for(i=0;i<3;i++)
¡¡¡¡printf("This is a pthread.n");
¡¡¡¡}
¡¡¡¡
¡¡¡¡int main(void)
¡¡¡¡{
¡¡¡¡pthread_t id;
¡¡¡¡int i,ret;
¡¡¡¡ret=pthread_create(&id,NULL,(void *) thread,NULL);
¡¡¡¡if(ret!=0){
¡¡¡¡printf ("Create pthread error!n");
¡¡¡¡exit (1);
¡¡¡¡}
¡¡¡¡for(i=0;i<3;i++)
¡¡¡¡printf("This is the main process.n");
¡¡¡¡pthread_join(id,NULL);
¡¡¡¡return (0);
¡¡¡¡}
¡¡¡¡
¡¡¡¡ÎÒÃDZàÒë´Ë³ÌÐò£º
¡¡¡¡gcc example1.c -lpthread -o example1
¡¡¡¡ÔËÐÐexample1£¬ÎÒÃǵõ½ÈçϽá¹û£º
¡¡¡¡This is the main process.
¡¡¡¡This is a pthread.
¡¡¡¡This is the main process.
¡¡¡¡This is the main process.
¡¡¡¡This is a pthread.
¡¡¡¡This is a pthread.
¡¡¡¡ÔÙ´ÎÔËÐУ¬ÎÒÃÇ¿ÉÄܵõ½ÈçϽá¹û£º
¡¡¡¡This is a pthread.
¡¡¡¡This is the main process.
¡¡¡¡This is a pthread.
¡¡¡¡This is the main process.
¡¡¡¡This is a pthread.
¡¡¡¡This is the main process.
¡¡¡¡
¡¡¡¡¡¡¡¡Ç°ºóÁ½´Î½á¹û²»Ò»Ñù£¬ÕâÊÇÁ½¸öÏß³ÌÕù¶áCPU×ÊÔ´µÄ½á¹û¡£ÉÏÃæµÄʾÀýÖУ¬ÎÒÃÇʹÓõ½ÁËÁ½¸öº¯Êý£¬¡¡¡¡pthread_createºÍpthread_join£¬²¢ÉùÃ÷ÁËÒ»¸öpthread_tÐ͵ıäÁ¿¡£
¡¡¡¡¡¡¡¡pthread_tÔÚÍ·Îļþ/usr/include/bits/pthreadtypes.hÖж¨Ò壺
¡¡¡¡¡¡¡¡typedef unsigned long int pthread_t;
¡¡¡¡¡¡¡¡ËüÊÇÒ»¸öÏ̵߳ıêʶ·û¡£º¯Êýpthread_createÓÃÀ´´´½¨Ò»¸öỊ̈߳¬ËüµÄÔ­ÐÍΪ£º
¡¡¡¡¡¡¡¡extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
¡¡¡¡¡¡¡¡void *(*__start_routine) (void *), void *__arg));
¡¡¡¡¡¡¡¡µÚÒ»¸ö²ÎÊýΪָÏòÏ̱߳êʶ·ûµÄÖ¸Õ룬µÚ¶þ¸ö²ÎÊýÓÃÀ´ÉèÖÃÏß³ÌÊôÐÔ£¬µÚÈý¸ö²ÎÊýÊÇÏß³ÌÔËÐк¯ÊýµÄÆðʼµØÖ·£¬×îºóÒ»¸ö²ÎÊýÊÇÔËÐк¯ÊýµÄ²ÎÊý¡£ÕâÀÎÒÃǵĺ¯Êýthread²»ÐèÒª²ÎÊý£¬ËùÒÔ×îºóÒ»¸ö²ÎÊýÉèΪ¿ÕÖ¸Õë¡£µÚ¶þ¸ö²ÎÊýÎÒÃÇÒ²ÉèΪ¿ÕÖ¸Õ룬ÕâÑù½«Éú³ÉĬÈÏÊôÐÔµÄÏ̡߳£¶ÔÏß³ÌÊôÐÔµÄÉ趨ºÍÐÞ¸ÄÎÒÃǽ«ÔÚÏÂÒ»½Ú²ûÊö¡£µ±´´½¨Ï̳߳ɹ¦Ê±£¬º¯Êý·µ»Ø0£¬Èô²»Îª0Ôò˵Ã÷´´½¨Ïß³Ìʧ°Ü£¬³£¼ûµÄ´íÎ󷵻شúÂëΪEAGAINºÍEINVAL¡£Ç°Õß±íʾϵͳÏÞÖÆ´´½¨ÐµÄỊ̈߳¬ÀýÈçÏß³ÌÊýÄ¿¹ý¶àÁË£»ºóÕß±íʾµÚ¶þ¸ö²ÎÊý´ú±íµÄÏß³ÌÊôÐÔÖµ·Ç·¨¡£´´½¨Ï̳߳ɹ¦ºó£¬Ð´´½¨µÄÏß³ÌÔòÔËÐвÎÊýÈýºÍ²ÎÊýËÄÈ·¶¨µÄº¯Êý£¬Ô­À´µÄÏß³ÌÔò¼ÌÐøÔËÐÐÏÂÒ»ÐдúÂë¡£
¡¡¡¡¡¡¡¡º¯Êýpthread_joinÓÃÀ´µÈ´ýÒ»¸öÏ̵߳ĽáÊø¡£º¯ÊýÔ­ÐÍΪ£º
¡¡¡¡¡¡¡¡extern int pthread_join __P ((pthread_t __th, void **__thread_return));
¡¡¡¡¡¡¡¡µÚÒ»¸ö²ÎÊýΪ±»µÈ´ýµÄÏ̱߳êʶ·û£¬µÚ¶þ¸ö²ÎÊýΪһ¸öÓû§¶¨ÒåµÄÖ¸Õ룬Ëü¿ÉÒÔÓÃÀ´´æ´¢±»µÈ´ýÏ̵߳ķµ»ØÖµ¡£Õâ¸öº¯ÊýÊÇÒ»¸öÏß³Ì×èÈûµÄº¯Êý£¬µ÷ÓÃËüµÄº¯Êý½«Ò»Ö±µÈ´ýµ½±»µÈ´ýµÄÏ߳̽áÊøΪֹ£¬µ±º¯Êý·µ»Øʱ£¬±»µÈ´ýÏ̵߳Ä×ÊÔ´±»Êջء£Ò»¸öÏ̵߳ĽáÊøÓÐÁ½ÖÖ;¾¶£¬Ò»ÖÖÊÇÏóÎÒÃÇÉÏÃæµÄÀý×ÓÒ»Ñù£¬º¯Êý½áÊøÁË£¬µ÷ÓÃËüµÄÏß³ÌÒ²¾Í½áÊøÁË£»ÁíÒ»ÖÖ·½Ê½ÊÇͨ¹ýº¯Êýpthread_exitÀ´ÊµÏÖ¡£ËüµÄº¯ÊýÔ­ÐÍΪ£º
¡¡¡¡¡¡¡¡extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
¡¡¡¡¡¡¡¡Î¨Ò»µÄ²ÎÊýÊǺ¯ÊýµÄ·µ»Ø´úÂ룬ֻҪpthread_joinÖеĵڶþ¸ö²ÎÊýthread_return²»ÊÇNULL£¬Õâ¸öÖµ½«±»´«µÝ¸øthread_return¡£×îºóҪ˵Ã÷µÄÊÇ£¬Ò»¸öÏ̲߳»Äܱ»¶à¸öÏ̵߳ȴý£¬·ñÔòµÚÒ»¸ö½ÓÊÕµ½ÐźŵÄÏ̳߳ɹ¦·µ»Ø£¬ÆäÓàµ÷ÓÃpthread_joinµÄÏß³ÌÔò·µ»Ø´íÎó´úÂëESRCH¡£
¡¡¡¡¡¡¡¡ÔÚÕâÒ»½ÚÀÎÒÃDZàдÁËÒ»¸ö×î¼òµ¥µÄỊ̈߳¬²¢ÕÆÎÕÁË×î³£ÓõÄÈý¸öº¯Êýpthread_create£¬pthread_joinºÍpthread_exit¡£ÏÂÃ棬ÎÒÃÇÀ´Á˽âÏ̵߳ÄһЩ³£ÓÃÊôÐÔÒÔ¼°ÈçºÎÉèÖÃÕâЩÊôÐÔ¡£
¡¡¡¡
¡¡¡¡3 ÐÞ¸ÄÏ̵߳ÄÊôÐÔ
¡¡¡¡¡¡¡¡ÔÚÉÏÒ»½ÚµÄÀý×ÓÀÎÒÃÇÓÃpthread_createº¯Êý´´½¨ÁËÒ»¸öỊ̈߳¬ÔÚÕâ¸öÏß³ÌÖУ¬ÎÒÃÇʹÓÃÁËĬÈϲÎÊý£¬¼´½«¸Ãº¯ÊýµÄµÚ¶þ¸ö²ÎÊýÉèΪNULL¡£µÄÈ·£¬¶Ô´ó¶àÊý³ÌÐòÀ´Ëµ£¬Ê¹ÓÃĬÈÏÊôÐԾ͹»ÁË£¬µ«ÎÒÃÇ»¹ÊÇÓбØÒªÀ´Á˽âÒ»ÏÂÏ̵߳ÄÓйØÊôÐÔ¡£
¡¡¡¡¡¡¡¡ÊôÐԽṹΪpthread_attr_t£¬ËüͬÑùÔÚÍ·Îļþ/usr/include/pthread.hÖж¨Ò壬ϲ»¶×·¸ùÎʵ׵ÄÈË¿ÉÒÔ×Ô¼ºÈ¥²é¿´¡£ÊôÐÔÖµ²»ÄÜÖ±½ÓÉèÖã¬ÐëʹÓÃÏà¹Øº¯Êý½øÐвÙ×÷£¬³õʼ»¯µÄº¯ÊýΪpthread_attr_init£¬Õâ¸öº¯Êý±ØÐëÔÚpthread_createº¯Êý֮ǰµ÷Óá£ÊôÐÔ¶ÔÏóÖ÷Òª°üÀ¨ÊÇ·ñ°ó¶¨¡¢ÊÇ·ñ·ÖÀë¡¢¶ÑÕ»µØÖ·¡¢¶ÑÕ»´óС¡¢ÓÅÏȼ¶¡£Ä¬ÈϵÄÊôÐÔΪ·Ç°ó¶¨¡¢·Ç·ÖÀ롢ȱʡ1MµÄ¶ÑÕ»¡¢Ó븸½ø³ÌͬÑù¼¶±ðµÄÓÅÏȼ¶¡£
¡¡¡¡¡¡¡¡¹ØÓÚÏ̵߳İ󶨣¬Ç£Éæµ½ÁíÍâÒ»¸ö¸ÅÄÇá½ø³Ì£¨LWP£ºLight Weight Process£©¡£Çá½ø³Ì¿ÉÒÔÀí½âΪÄÚºËỊ̈߳¬ËüλÓÚÓû§²ãºÍϵͳ²ãÖ®¼ä¡£ÏµÍ³¶ÔÏß³Ì×ÊÔ´µÄ·ÖÅä¡¢¶ÔÏ̵߳ĿØÖÆÊÇͨ¹ýÇá½ø³ÌÀ´ÊµÏֵģ¬Ò»¸öÇá½ø³Ì¿ÉÒÔ¿ØÖÆÒ»¸ö»ò¶à¸öÏ̡߳£Ä¬ÈÏ×´¿öÏ£¬Æô¶¯¶àÉÙÇá½ø³Ì¡¢ÄÄЩÇá½ø³ÌÀ´¿ØÖÆÄÄЩÏß³ÌÊÇÓÉϵͳÀ´¿ØÖƵģ¬ÕâÖÖ×´¿ö¼´³ÆΪ·Ç°ó¶¨µÄ¡£°ó¶¨×´¿öÏ£¬Ôò¹ËÃû˼Ò壬¼´Ä³¸öÏ̶̹߳¨µÄ"°ó"ÔÚÒ»¸öÇá½ø³ÌÖ®ÉÏ¡£±»°ó¶¨µÄÏ߳̾ßÓнϸߵÄÏìÓ¦Ëٶȣ¬ÕâÊÇÒòΪCPUʱ¼äƬµÄµ÷¶ÈÊÇÃæÏòÇá½ø³ÌµÄ£¬°ó¶¨µÄÏ߳̿ÉÒÔ±£Ö¤ÔÚÐèÒªµÄʱºòËü×ÜÓÐÒ»¸öÇá½ø³Ì¿ÉÓá£Í¨¹ýÉèÖñ»°ó¶¨µÄÇá½ø³ÌµÄÓÅÏȼ¶ºÍµ÷¶È¼¶¿ÉÒÔʹµÃ°ó¶¨µÄÏß³ÌÂú×ãÖîÈçʵʱ·´Ó¦Ö®ÀàµÄÒªÇó¡£
¡¡¡¡¡¡¡¡ÉèÖÃḬ̈߳ó¶¨×´Ì¬µÄº¯ÊýΪpthread_attr_setscope£¬ËüÓÐÁ½¸ö²ÎÊý£¬µÚÒ»¸öÊÇÖ¸ÏòÊôÐԽṹµÄÖ¸Õ룬µÚ¶þ¸öÊÇ°ó¶¨ÀàÐÍ£¬ËüÓÐÁ½¸öÈ¡Öµ£ºPTHREAD_SCOPE_SYSTEM£¨°ó¶¨µÄ£©ºÍPTHREAD_SCOPE_PROCESS£¨·Ç°ó¶¨µÄ£©¡£ÏÂÃæµÄ´úÂë¼´´´½¨ÁËÒ»¸ö°ó¶¨µÄÏ̡߳£
¡¡¡¡#include
¡¡¡¡pthread_attr_t attr;
¡¡¡¡pthread_t tid;
¡¡¡¡
¡¡¡¡/*³õʼ»¯ÊôÐÔÖµ£¬¾ùÉèΪĬÈÏÖµ*/
¡¡¡¡pthread_attr_init(&attr);
¡¡¡¡pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
¡¡¡¡
¡¡¡¡pthread_create(&tid, &attr, (void *) my_function, NULL);
¡¡¡¡
¡¡¡¡¡¡¡¡Ï̵߳ķÖÀë״̬¾ö¶¨Ò»¸öÏß³ÌÒÔʲôÑùµÄ·½Ê½À´ÖÕÖ¹×Ô¼º¡£ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃDzÉÓÃÁËÏ̵߳ÄĬÈÏÊôÐÔ£¬¼´Îª·Ç·ÖÀë״̬£¬ÕâÖÖÇé¿öÏ£¬Ô­ÓеÄÏ̵߳ȴý´´½¨µÄÏ߳̽áÊø¡£Ö»Óе±pthread_join£¨£©º¯Êý·µ»Øʱ£¬´´½¨µÄÏ̲߳ÅËãÖÕÖ¹£¬²ÅÄÜÊÍ·Å×Ô¼ºÕ¼ÓõÄϵͳ×ÊÔ´¡£¶ø·ÖÀëÏ̲߳»ÊÇÕâÑù×ӵģ¬ËüûÓб»ÆäËûµÄÏß³ÌËùµÈ´ý£¬×Ô¼ºÔËÐнáÊøÁË£¬Ïß³ÌÒ²¾ÍÖÕÖ¹ÁË£¬ÂíÉÏÊÍ·Åϵͳ×ÊÔ´¡£³ÌÐòÔ±Ó¦¸Ã¸ù¾Ý×Ô¼ºµÄÐèÒª£¬Ñ¡ÔñÊʵ±µÄ·ÖÀë״̬¡£ÉèÖÃÏ̷߳ÖÀë״̬µÄº¯ÊýΪpthread_attr_setdetachstate£¨pthread_attr_t *attr, int detachstate£©¡£µÚ¶þ¸ö²ÎÊý¿ÉѡΪPTHREAD_CREATE_DETACHED£¨·ÖÀëỊ̈߳©ºÍ PTHREAD _CREATE_JOINABLE£¨·Ç·ÖÀëỊ̈߳©¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 5 ÌõÆÀÂÛ

  1. mkforlinux ÓÚ 2012-02-21 20:18:04·¢±í:

    ÐÂÊÖѧϰÖÐ

  2. zhoutingting ÓÚ 2011-09-21 20:14:43·¢±í:

    ¡¡¡¡¡¡LinuxϵͳϵĶàÏß³Ì×ñÑ­POSIXÏ߳̽ӿڣ¬³ÆΪpthread¡£±àдLinuxϵĶàÏ̳߳ÌÐò£¬ÐèҪʹÓÃÍ·Îļþpthread.h£¬Á¬½ÓʱÐèҪʹÓÿâlibpthread.a¡£Ë³±ã˵һÏ£¬LinuxÏÂpthreadµÄʵÏÖÊÇͨ¹ýϵͳµ÷ÓÃclone£¨£©À´ÊµÏֵġ£clone£¨£©ÊÇLinuxËùÌØÓеÄϵͳµ÷Óã¬ËüµÄʹÓ÷½Ê½ÀàËÆfork£¬¹ØÓÚclone£¨£©µÄÏêϸÇé¿ö£¬ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔÈ¥²é¿´ÓйØÎĵµËµÃ÷¡£ÏÂÃæÎÒÃÇչʾһ¸ö×î¼òµ¥µÄ¶àÏ̳߳ÌÐòexample1.c¡£
    ¡¡¡¡
    ¡¡¡¡/* example.c*/
    ¡¡¡¡#include
    ¡¡¡¡#include
    ¡¡¡¡void thread(void)
    ¡¡¡¡{
    ¡¡¡¡int i;
    ¡¡¡¡for(i=0;i<3;i++)
    ¡¡¡¡printf("This is a pthread.n");
    ¡¡¡¡}
    ¡¡¡¡
    ¡¡¡¡int main(void)
    ¡¡¡¡{
    ¡¡¡¡pthread_t id;
    ¡¡¡¡int i,ret;
    ¡¡¡¡ret=pthread_create(&id,NULL,(void *) thread,NULL);
    ¡¡¡¡if(ret!=0){
    ¡¡¡¡printf ("Create pthread error!n");
    ¡¡¡¡exit (1);
    ¡¡¡¡}
    ¡¡¡¡for(i=0;i<3;i++)
    ¡¡¡¡printf("This is the main process.n");
    ¡¡¡¡pthread_join(id,NULL);
    ¡¡¡¡return (0);
    ¡¡¡¡}
    ¡¡¡¡
    ¡¡¡¡ÎÒÃDZàÒë´Ë³ÌÐò£º
    ¡¡¡¡gcc example1.c -lpthread -o example1
    ¡¡¡¡ÔËÐÐexample1£¬ÎÒÃǵõ½ÈçϽá¹û£º
    ¡¡¡¡This is the main process.
    ¡¡¡¡This is a pthread.
    ¡¡¡¡This is the main process.
    ¡¡¡¡This is the main process.
    ¡¡¡¡This is a pthread.
    ¡¡¡¡This is a pthread.
    ¡¡¡¡ÔÙ´ÎÔËÐУ¬ÎÒÃÇ¿ÉÄܵõ½ÈçϽá¹û£º
    ¡¡¡¡This is a pthread.
    ¡¡¡¡This is the main process.
    ¡¡¡¡This is a pthread.
    ¡¡¡¡This is the main process.
    ¡¡¡¡This is a pthread.
    ¡¡¡¡This is the main process.
    ¡¡¡¡
    ¡¡¡¡¡¡¡¡Ç°ºóÁ½´Î½á¹û²»Ò»Ñù£¬ÕâÊÇÁ½¸öÏß³ÌÕù¶áCPU×ÊÔ´µÄ½á¹û¡£ÉÏÃæµÄʾÀýÖУ¬ÎÒÃÇʹÓõ½ÁËÁ½¸öº¯Êý£¬¡¡¡¡pthread_createºÍpthread_join£¬²¢ÉùÃ÷ÁËÒ»¸öpthread_tÐ͵ıäÁ¿¡£
    ¡¡¡¡¡¡¡¡pthread_tÔÚÍ·Îļþ/usr/include/bits/pthreadtypes.hÖж¨Ò壺
    ¡¡¡¡¡¡¡¡typedef unsigned long int pthread_t;
    ¡¡¡¡¡¡¡¡ËüÊÇÒ»¸öÏ̵߳ıêʶ·û¡£º¯Êýpthread_createÓÃÀ´´´½¨Ò»¸öỊ̈߳¬ËüµÄÔ­ÐÍΪ£º
    ¡¡¡¡¡¡¡¡extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
    ¡¡¡¡¡¡¡¡void *(*__start_routine) (void *), void *__arg));
    ¡¡¡¡¡¡¡¡µÚÒ»¸ö²ÎÊýΪָÏòÏ̱߳êʶ·ûµÄÖ¸Õ룬µÚ¶þ¸ö²ÎÊýÓÃÀ´ÉèÖÃÏß³ÌÊôÐÔ£¬µÚÈý¸ö²ÎÊýÊÇÏß³ÌÔËÐк¯ÊýµÄÆðʼµØÖ·£¬×îºóÒ»¸ö²ÎÊýÊÇÔËÐк¯ÊýµÄ²ÎÊý¡£ÕâÀÎÒÃǵĺ¯Êýthread²»ÐèÒª²ÎÊý£¬ËùÒÔ×îºóÒ»¸ö²ÎÊýÉèΪ¿ÕÖ¸Õë¡£µÚ¶þ¸ö²ÎÊýÎÒÃÇÒ²ÉèΪ¿ÕÖ¸Õ룬ÕâÑù½«Éú³ÉĬÈÏÊôÐÔµÄÏ̡߳£¶ÔÏß³ÌÊôÐÔµÄÉ趨ºÍÐÞ¸ÄÎÒÃǽ«ÔÚÏÂÒ»½Ú²ûÊö¡£µ±´´½¨Ï̳߳ɹ¦Ê±£¬º¯Êý·µ»Ø0£¬Èô²»Îª0Ôò˵Ã÷´´½¨Ïß³Ìʧ°Ü£¬³£¼ûµÄ´íÎ󷵻شúÂëΪEAGAINºÍEINVAL¡£Ç°Õß±íʾϵͳÏÞÖÆ´´½¨ÐµÄỊ̈߳¬ÀýÈçÏß³ÌÊýÄ¿¹ý¶àÁË£»ºóÕß±íʾµÚ¶þ¸ö²ÎÊý´ú±íµÄÏß³ÌÊôÐÔÖµ·Ç·¨¡£´´½¨Ï̳߳ɹ¦ºó£¬Ð´´½¨µÄÏß³ÌÔòÔËÐвÎÊýÈýºÍ²ÎÊýËÄÈ·¶¨µÄº¯Êý£¬Ô­À´µÄÏß³ÌÔò¼ÌÐøÔËÐÐÏÂÒ»ÐдúÂë¡£
    ¡¡¡¡¡¡¡¡º¯Êýpthread_joinÓÃÀ´µÈ´ýÒ»¸öÏ̵߳ĽáÊø¡£º¯ÊýÔ­ÐÍΪ£º
    ¡¡¡¡¡¡¡¡extern int pthread_join __P ((pthread_t __th, void **__thread_return));
    ¡¡¡¡¡¡¡¡µÚÒ»¸ö²ÎÊýΪ±»µÈ´ýµÄÏ̱߳êʶ·û£¬µÚ¶þ¸ö²ÎÊýΪһ¸öÓû§¶¨ÒåµÄÖ¸Õ룬Ëü¿ÉÒÔÓÃÀ´´æ´¢±»µÈ´ýÏ̵߳ķµ»ØÖµ¡£Õâ¸öº¯ÊýÊÇÒ»¸öÏß³Ì×èÈûµÄº¯Êý£¬µ÷ÓÃËüµÄº¯Êý½«Ò»Ö±µÈ´ýµ½±»µÈ´ýµÄÏ߳̽áÊøΪֹ£¬µ±º¯Êý·µ»Øʱ£¬±»µÈ´ýÏ̵߳Ä×ÊÔ´±»Êջء£Ò»¸öÏ̵߳ĽáÊøÓÐÁ½ÖÖ;¾¶£¬Ò»ÖÖÊÇÏóÎÒÃÇÉÏÃæµÄÀý×ÓÒ»Ñù£¬º¯Êý½áÊøÁË£¬µ÷ÓÃËüµÄÏß³ÌÒ²¾Í½áÊøÁË£»ÁíÒ»ÖÖ·½Ê½ÊÇͨ¹ýº¯Êýpthread_exitÀ´ÊµÏÖ¡£ËüµÄº¯ÊýÔ­ÐÍΪ£º
    ¡¡¡¡¡¡¡¡extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
    ¡¡¡¡¡¡¡¡Î¨Ò»µÄ²ÎÊýÊǺ¯ÊýµÄ·µ»Ø´úÂ룬ֻҪpthread_joinÖеĵڶþ¸ö²ÎÊýthread_return²»ÊÇNULL£¬Õâ¸öÖµ½«±»´«µÝ¸øthread_return¡£×îºóҪ˵Ã÷µÄÊÇ£¬Ò»¸öÏ̲߳»Äܱ»¶à¸öÏ̵߳ȴý£¬·ñÔòµÚÒ»¸ö½ÓÊÕµ½ÐźŵÄÏ̳߳ɹ¦·µ»Ø£¬ÆäÓàµ÷ÓÃpthread_joinµÄÏß³ÌÔò·µ»Ø´íÎó´úÂëESRCH¡£
    ¡¡¡¡¡¡¡¡ÔÚÕâÒ»½ÚÀÎÒÃDZàдÁËÒ»¸ö×î¼òµ¥µÄỊ̈߳¬²¢ÕÆÎÕÁË×î³£ÓõÄÈý¸öº¯Êýpthread_create£¬pthread_joinºÍpthread_exit¡£ÏÂÃ棬ÎÒÃÇÀ´Á˽âÏ̵߳ÄһЩ³£ÓÃÊôÐÔÒÔ¼°ÈçºÎÉèÖÃÕâЩÊôÐÔ¡£
    ¡¡¡¡
    ¡¡¡¡3 ÐÞ¸ÄÏ̵߳ÄÊôÐÔ
    ¡¡¡¡¡¡¡¡ÔÚÉÏÒ»½ÚµÄÀý×ÓÀÎÒÃÇÓÃpthread_createº¯Êý´´½¨ÁËÒ»¸öỊ̈߳¬ÔÚÕâ¸öÏß³ÌÖУ¬ÎÒÃÇʹÓÃÁËĬÈϲÎÊý£¬¼´½«¸Ãº¯ÊýµÄµÚ¶þ¸ö²ÎÊýÉèΪNULL¡£µÄÈ·£¬¶Ô´ó¶àÊý³ÌÐòÀ´Ëµ£¬Ê¹ÓÃĬÈÏÊôÐԾ͹»ÁË£¬µ«ÎÒÃÇ»¹ÊÇÓбØÒªÀ´Á˽âÒ»ÏÂÏ̵߳ÄÓйØÊôÐÔ¡£
    ¡¡¡¡¡¡¡¡ÊôÐԽṹΪpthread_attr_t£¬ËüͬÑùÔÚÍ·Îļþ/usr/include/pthread.hÖж¨Ò壬ϲ»¶×·¸ùÎʵ׵ÄÈË¿ÉÒÔ×Ô¼ºÈ¥²é¿´¡£ÊôÐÔÖµ²»ÄÜÖ±½ÓÉèÖã¬ÐëʹÓÃÏà¹Øº¯Êý½øÐвÙ×÷£¬³õʼ»¯µÄº¯ÊýΪpthread_attr_init£¬Õâ¸öº¯Êý±ØÐëÔÚpthread_createº¯Êý֮ǰµ÷Óá£ÊôÐÔ¶ÔÏóÖ÷Òª°üÀ¨ÊÇ·ñ°ó¶¨¡¢ÊÇ·ñ·ÖÀë¡¢¶ÑÕ»µØÖ·¡¢¶ÑÕ»´óС¡¢ÓÅÏȼ¶¡£Ä¬ÈϵÄÊôÐÔΪ·Ç°ó¶¨¡¢·Ç·ÖÀ롢ȱʡ1MµÄ¶ÑÕ»¡¢Ó븸½ø³ÌͬÑù¼¶±ðµÄÓÅÏȼ¶¡£
    ¡¡¡¡¡¡¡¡¹ØÓÚÏ̵߳İ󶨣¬Ç£Éæµ½ÁíÍâÒ»¸ö¸ÅÄÇá½ø³Ì£¨LWP£ºLight Weight Process£©¡£Çá½ø³Ì¿ÉÒÔÀí½âΪÄÚºËỊ̈߳¬ËüλÓÚÓû§²ãºÍϵͳ²ãÖ®¼ä¡£ÏµÍ³¶ÔÏß³Ì×ÊÔ´µÄ·ÖÅä¡¢¶ÔÏ̵߳ĿØÖÆÊÇͨ¹ýÇá½ø³ÌÀ´ÊµÏֵģ¬Ò»¸öÇá½ø³Ì¿ÉÒÔ¿ØÖÆÒ»¸ö»ò¶à¸öÏ̡߳£Ä¬ÈÏ×´¿öÏ£¬Æô¶¯¶àÉÙÇá½ø³Ì¡¢ÄÄЩÇá½ø³ÌÀ´¿ØÖÆÄÄЩÏß³ÌÊÇÓÉϵͳÀ´¿ØÖƵģ¬ÕâÖÖ×´¿ö¼´³ÆΪ·Ç°ó¶¨µÄ¡£°ó¶¨×´¿öÏ£¬Ôò¹ËÃû˼Ò壬¼´Ä³¸öÏ̶̹߳¨µÄ"°ó"ÔÚÒ»¸öÇá½ø³ÌÖ®ÉÏ¡£±»°ó¶¨µÄÏ߳̾ßÓнϸߵÄÏìÓ¦Ëٶȣ¬ÕâÊÇÒòΪCPUʱ¼äƬµÄµ÷¶ÈÊÇÃæÏòÇá½ø³ÌµÄ£¬°ó¶¨µÄÏ߳̿ÉÒÔ±£Ö¤ÔÚÐèÒªµÄʱºòËü×ÜÓÐÒ»¸öÇá½ø³Ì¿ÉÓá£Í¨¹ýÉèÖñ»°ó¶¨µÄÇá½ø³ÌµÄÓÅÏȼ¶ºÍµ÷¶È¼¶¿ÉÒÔʹµÃ°ó¶¨µÄÏß³ÌÂú×ãÖîÈçʵʱ·´Ó¦Ö®ÀàµÄÒªÇó¡£
    ¡¡¡¡¡¡¡¡ÉèÖÃḬ̈߳ó¶¨×´Ì¬µÄº¯ÊýΪpthread_attr_setscope£¬ËüÓÐÁ½¸ö²ÎÊý£¬µÚÒ»¸öÊÇÖ¸ÏòÊôÐԽṹµÄÖ¸Õ룬µÚ¶þ¸öÊÇ°ó¶¨ÀàÐÍ£¬ËüÓÐÁ½¸öÈ¡Öµ£ºPTHREAD_SCOPE_SYSTEM£¨°ó¶¨µÄ£©ºÍPTHREAD_SCOPE_PROCESS£¨·Ç°ó¶¨µÄ£©¡£ÏÂÃæµÄ´úÂë¼´´´½¨ÁËÒ»¸ö°ó¶¨µÄÏ̡߳£
    ¡¡¡¡#include
    ¡¡¡¡pthread_attr_t attr;
    ¡¡¡¡pthread_t tid;
    ¡¡¡¡
    ¡¡¡¡/*³õʼ»¯ÊôÐÔÖµ£¬¾ùÉèΪĬÈÏÖµ*/
    ¡¡¡¡pthread_attr_init(&attr);
    ¡¡¡¡pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
    ¡¡¡¡
    ¡¡¡¡pthread_create(&tid, &attr, (void *) my_function, NULL);
    ¡¡¡¡
    ¡¡¡¡¡¡¡¡Ï̵߳ķÖÀë״̬¾ö¶¨Ò»¸öÏß³ÌÒÔʲôÑùµÄ·½Ê½À´ÖÕÖ¹×Ô¼º¡£ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃDzÉÓÃÁËÏ̵߳ÄĬÈÏÊôÐÔ£¬¼´Îª·Ç·ÖÀë״̬£¬ÕâÖÖÇé¿öÏ£¬Ô­ÓеÄÏ̵߳ȴý´´½¨µÄÏ߳̽áÊø¡£Ö»Óе±pthread_join£¨£©º¯Êý·µ»Øʱ£¬´´½¨µÄÏ̲߳ÅËãÖÕÖ¹£¬²ÅÄÜÊÍ·Å×Ô¼ºÕ¼ÓõÄϵͳ×ÊÔ´¡£¶ø·ÖÀëÏ̲߳»ÊÇÕâÑù×ӵģ¬ËüûÓб»ÆäËûµÄÏß³ÌËùµÈ´ý£¬×Ô¼ºÔËÐнáÊøÁË£¬Ïß³ÌÒ²¾ÍÖÕÖ¹ÁË£¬ÂíÉÏÊÍ·Åϵͳ×ÊÔ´¡£³ÌÐòÔ±Ó¦¸Ã¸ù¾Ý×Ô¼ºµÄÐèÒª£¬Ñ¡ÔñÊʵ±µÄ·ÖÀë״̬¡£ÉèÖÃÏ̷߳ÖÀë״̬µÄº¯ÊýΪpthread_attr_setdetachstate£¨pthread_attr_t *attr, int detachstate£©¡£µÚ¶þ¸ö²ÎÊý¿ÉѡΪPTHREAD_CREATE_DETACHED£¨·ÖÀëỊ̈߳©ºÍ PTHREAD _CREATE_JOINABLE£¨·Ç·ÖÀëỊ̈߳©¡£

  3. wolf_zhuzy ÓÚ 2011-09-16 20:45:13·¢±í:

    ²»´í£¬ÓеãÓô¦

  4. zbatecn ÓÚ 2010-01-25 20:44:02·¢±í:

    Éî°Â£¬Ö±½Ó¾Í²»¶®ÁË

  5. ciscobhl ÓÚ 2010-01-25 18:08:17·¢±í:

    ¸ç¸ç ÄãÒªÊÇд³ÉÎı¾¾ÍºÃÁË