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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
LinuxÖеÄÏß³Ì
 
 
  1967  次浏览      27
 2020-12-23 
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½²½âÁËÏ̵߳ĸÅÄî¡¢ÌØµã¡¢´´½¨µÈÏà¹Ø°¸ÀýÒÔ¼°ËÀËøµÄÏà¹ØµÄ¼ì²â¡¢Ô¤·À¡¢½â³ýµÈµÈÏà¹Ø¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

Ï̵߳ĸÅÄî

Ïß³ÌÊdzÌÐòÖ´ÐÐʱµÄ×îСµ¥Î»£¬¼´CPUµ÷¶ÈºÍ·ÖÅɵĻù±¾µ¥Î»£¬Ò»¸ö½ø³Ì¿ÉÒÔÓɶà¸öÏß³Ì×é³É£¬Í¬Ò»¸ö½ø³ÌÖеĶà¸öÏß³ÌÖ®¼ä¹²Ïí´Ë½ø³ÌµÄËùÓÐ×ÊÔ´£¬Ã¿¸öÏß³ÌÓÐ×Ô¼ºµÄ¶ÑÕ»ºÍ¾Ö²¿±äÁ¿¡£Ïß³ÌÓÉCPU¶ÀÁ¢µ÷¶ÈÖ´ÐУ¬ÔÚ¶àCPU»·¾³Ï¾ÍÔÊÐí¶à¸öÏß³ÌͬʱÔËÐС£Í¬Ñù¶àÏß³ÌÒ²¿ÉÒÔʵÏÖ²¢·¢²Ù×÷£¬Ã¿¸öÇëÇó·ÖÅäÒ»¸öÏß³ÌÀ´´¦Àí¡£

Ïß³ÌÓÐËÄ·½ÃæÌص㣺

1.Ïß³ÌÓжÀÁ¢µÄ¶ÑÕ»¶Î£¬¹²ÏíµØÖ·¿Õ¼ä£¬¿ªÏú½ÏС£¬Çл»ËٶȽϿ졣

2.Ï̼߳äµÄͨÐÅ»úÖÆ±È½Ï·½±ã¡£

3.ÒòΪ²Ù×÷ϵͳ»á±£Ö¤µ±Ïß³ÌÊý²»´óÓÚCPUÊýĿʱ£¬²»Í¬µÄÏß³ÌÔËÐÐÓÚ²»Í¬µÄCPUÉÏ¡£Ïß³ÌʹCPUϵͳ¸ü¼ÓÓÐЧ¡£

4.Ï̸߳ÄÉÆÁ˳ÌÐò½á¹¹£¬±ÜÃâÁËһЩǶÌ×Ñ­»·¡£

ʹÓÃpthread_create()º¯ÊýÀ´´´½¨Ị̈߳¬Ê¹ÓÃÏ̵߳ÄʱºòÓÐÁ½µã×¢ÒâÊÂÏ

1.µ±¶àÏ̷߳ÃÎÊͬһȫ¾Ö±äÁ¿µÄʱºò£¬Ò»¶¨Òª¼Ó»¥³âÁ¿£¬Ò²¾ÍÊÇÉÏËø¡£µ±È»×îºó²»ÒªÍü¼ÇÁ˽âËø¡£

2.ÕýÈ·´¦ÀíÏ߳̽áÊøµÄÎÊÌ⣺ÒòΪһ¸öÏ̵߳ÄÖÕÖ¹£¬Ï̵߳Ä×ÊÔ´²»»áËæÏ̵߳ÄÖÕÖ¹ÊÍ·Å£¬ÎÒÃÇÐèÒªµ÷ÓÃpthread_join() À´»ñµÃÁíÒ»¸öÏ̵߳ÄÖÕֹ״̬²¢ÇÒÊͷŸÃÏß³ÌËùÕ¼µÄ×ÊÔ´¡£

Ïß³ÌÓë½ø³ÌµÄÇø±ð

µØÖ·¿Õ¼ä£ºÍ¬½ø³ÌÖеÄÏ̹߳²Ïí´Ë½ø³ÌµÄµØÖ·¿Õ¼ä£¬¶ø½ø³ÌÖ®¼äÔòÊǶÀÁ¢µÄµØÖ·¿Õ¼ä£¬ÊǸôÀëµÄ¡£

×ÊÔ´ÓµÓУºÍ¬Ò»½ø³ÌÄÚµÄÏ̹߳²Ïí±¾½ø³ÌµÄ×ÊÔ´ÈçÄÚ´æ¡¢I/O¡¢cpuµÈ£¬µ«Êǽø³ÌÖ®¼äµÄ×ÊÔ´ÊǶÀÁ¢µÄ¡£

½¡×³ÐÔ£ºÒ»¸ö½ø³Ì±ÀÀ£ºó£¬ÔÚ±£»¤Ä£Ê½Ï²»»á¶ÔÆäËû½ø³Ì²úÉúÓ°Ï죬µ«ÊÇÒ»¸öÏ̱߳ÀÀ£Õû¸ö½ø³Ì¶¼ËÀµô¡£ËùÒÔ¶à½ø³ÌÒª±È¶àÏ߳̽¡×³¡£

½ø³ÌÇл»Ê±£¬ÏûºÄµÄ×ÊÔ´´ó£¬Ð§Âʸߡ£ËùÒÔÉæ¼°µ½Æµ·±µÄÇл»Ê±£¬Ê¹ÓÃÏß³ÌÒªºÃÓÚ½ø³Ì¡£Í¬ÑùÈç¹ûÒªÇóͬʱ½øÐв¢ÇÒÓÖÒª¹²ÏíijЩ±äÁ¿µÄ²¢·¢²Ù×÷£¬Ö»ÄÜÓÃÏ̲߳»ÄÜÓýø³Ì

Ö´Ðйý³Ì£ºÃ¿¸ö¶ÀÁ¢µÄ½ø³Ì³ÌÓÐÒ»¸ö³ÌÐòÔËÐеÄÈë¿Ú¡¢Ë³ÐòÖ´ÐÐÐòÁкͳÌÐòÈë¿Ú¡£µ«ÊÇÏ̲߳»ÄܶÀÁ¢Ö´ÐУ¬±ØÐëÒÀ´æÔÚÓ¦ÓóÌÐòÖУ¬ÓÉÓ¦ÓóÌÐòÌṩ¶à¸öÏß³ÌÖ´ÐпØÖÆ¡£

Ïß³ÌÊÇ´¦ÀíÆ÷µ÷¶ÈµÄ»ù±¾µ¥Î»£¬µ«Êǽø³Ì²»ÊÇ¡£

Ïß³ÌÓë½ø³ÌµÄ¹²Í¬µã£ºÁ½Õß¾ù¿É²¢·¢Ö´ÐС£

ÓÅȱµã£º

-Ïß³ÌÖ´ÐпªÏúС£¬µ«ÊDz»ÀûÓÚ×ÊÔ´µÄ¹ÜÀíºÍ±£»¤¡£

-½ø³ÌÖ´ÐпªÏú´ó£¬µ«ÊÇÄܹ»ºÜºÃµÄ½øÐÐ×ÊÔ´¹ÜÀíºÍ±£»¤¡£

Ï̻߳ù±¾±à³Ì

LinuxϵͳϵĶàÏß³Ì×ñÑ­POSIXÏ߳̽ӿڣ¬³ÆÎªpthread¡£±àдLinuxϵĶàÏ̳߳ÌÐò£¬ÐèҪʹÓÃÍ·Îļþpthread.h£¬Á¬½ÓʱÐèҪʹÓÿâlibpthread.a¡£ÒòΪpthreadµÄ¿â²»ÊÇLinuxϵͳµÄ¿â£¬ËùÒÔÔÚ±àÒëʱҪ¼ÓÉÏ -lpthread¡£

ÀýÈ磺g++ -o main filename.cpp -lpthread¡£

1.Ï̴߳´½¨pthread_create()

´´½¨Ïß³Ìʵ¼ÊÉϾÍÊÇÈ·¶¨µ÷ÓøÃÏ̺߳¯ÊýµÄÈë¿Úµã£¬ÕâÀïͨ³£Ê¹Óõĺ¯ÊýÊÇpthread_create()

/* pthread_create.cpp */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void *thread_a(void *argv)
{
printf("I am the thread_a, I get a parameter(thread_id) that is:%ld\n",*(int *)argv);
printf("ÎÒ×Ô¼º»ñÈ¡µÄÏß³ÌidΪ£º%u\n", (unsigned int)pthread_self());
sleep(3);//²âÊÔÖ÷Ïß³ÌÊÇ·ñ×èÈûµÈ´ý
pthread_exit((char *)"I am the thread_a,I will exit!");
}
void *thread_b(void *argv)
{
printf("I am the thread_b,I get a parameter(thread_id) that is:%ld\n",*(int *)argv);
printf("ÎÒ×Ô¼º»ñÈ¡µÄÏß³ÌidΪ£º%u\n",(unsigned int)pthread_self());
pthread_exit((char *)"I am the thread_b,I will exit!");
}

int main(int argc, char const *argv[])
{
/* code */
pthread_t tid_a,tid_b;//ÉùÃ÷Ïß³Ìid
int ret;
void *tmp1;
void *tmp2;
/* ´´½¨Ị̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐthread_aº¯Êý£¬²¢ÇÒ´«µÝÒ»¸ö²ÎÊýΪµ±Ç°Ï̵߳ıêʶ·û */
ret = pthread_create (&tid_a,NULL,thread_a,(void *)&tid_a);
if (ret) {
printf("create thread error\n");
exit(1);
}
printf("tid_a = %u\n",(unsigned int)tid_a);
/* ´´½¨Ị̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐthread_bº¯Êý£¬²¢ÇÒ´«µÝÒ»¸ö²ÎÊýΪµ±Ç°Ï̵߳ıêʶ·û */
ret = pthread_create (&tid_b,NULL,thread_b,(void *)&tid_b);
if (ret) {
printf("create thread error\n");
exit(1);
}
printf("tid_b = %u\n",(unsigned int)tid_b);
/* µÈ´ýÁ½¸ö½ø³Ì¶¼Í˳öºó£¬ÔÚÍ˳öÖ÷Ị̈߳¨main£© */
pthread_join(tid_a,&tmp1);
pthread_join(tid_b,&tmp2);
printf("´Ó½ø³Ì»ñÈ¡µÄÊý¾ÝΪ£º%s-----ºÍ-----%s\n",tmp1,tmp2);
return 0;
}

½á¹û£º
xzj@xzj-VirtualBox: ~/development_test/pthread$ ./pthread_create_main tid_a = 2505316096
tid_b = 2496923392
I am the thread_b,I get a parameter(thread_id) that is:2496923392
ÎÒ×Ô¼º»ñÈ¡µÄÏß³ÌidΪ£º2496923392
I am the thread_a, I get a parameter(thread_id) that is:2505316096
ÎÒ×Ô¼º»ñÈ¡µÄÏß³ÌidΪ£º2505316096
´ÓÏ̻߳ñÈ¡µÄÊý¾ÝΪ£ºI am the thread_a, I will exit!-----ºÍ-----I am the thread_b,I will exit!

2.Ï߳̽áÊøpthread_exit()

ÔÚÏ̴߳´½¨ºó£¬¾Í¿ªÊ¼ÔËÐÐÏà¹ØµÄÏ̺߳¯Êý£¬Ôڸú¯ÊýÔËÐÐÍêÖ®ºó£¬¸ÃÏß³ÌÒ²¾ÍÍ˳öÁË£¬ÕâÒ²ÊÇÏß³ÌÍ˳öµÄÒ»ÖÖ·½·¨¡£ÁíÒ»ÖÖÍ˳öÏ̵߳ķ½·¨ÊÇʹÓú¯Êýpthread_exit()£¬ÕâÊÇÏ̵߳ÄÖ÷¶¯ÐÐΪ¡£ÕâÀïҪעÒâµÄÊÇ£¬ÔÚʹÓÃÏ̺߳¯Êýʱ£¬²»ÄÜËæÒâʹÓÃexit()Í˳öº¯ÊýÀ´½øÐгö´í´¦Àí¡£ÓÉÓÚexit()µÄ×÷ÓÃÊÇʹµ÷Óýø³ÌÖÕÖ¹£¬¶øÒ»¸ö½ø³ÌÍùÍù°üº¬¶à¸öỊ̈߳¬Òò´Ë£¬ÔÚʹÓÃexit()Ö®ºó£¬¸Ã½ø³ÌÖеÄËùÓÐÏ̶߳¼ÖÕÖ¹ÁË¡£ÔÚÏß³ÌÖоͿÉÒÔʹÓÃpthread_exit()À´´úÌæ½ø³ÌÖеÄexit()¡£

3.Ï̵߳ȴýpthread_join()

ÓÉÓÚÒ»¸ö½ø³ÌÖеĶà¸öÏß³ÌÊǹ²ÏíÊý¾Ý¶ÎµÄ£¬Òò´Ë£¬Í¨³£ÔÚÏß³ÌÍ˳öºó£¬Í˳öÏß³ÌËùÕ¼ÓõÄ×ÊÔ´²¢²»»áËæ×ÅÏ̵߳ÄÖÕÖ¹¶øµÃµ½ÊÍ·Å¡£ÕýÈç½ø³ÌÖ®¼ä¿ÉÒÔÓÃwait()ϵͳµ÷ÓÃÀ´Í¬²½ÖÕÖ¹²¢ÊÍ·Å×ÊÔ´Ò»Ñù£¬Ïß³ÌÖ®¼äÒ²ÓÐÀàËÆ»úÖÆ£¬ÄǾÍÊÇpthread_join()º¯Êý¡£pthread_join()ÓÃÓÚ½«µ±Ç°½ø³Ì¹ÒÆðÀ´µÈ´ýÏ̵߳ĽáÊø¡£Õâ¸öº¯ÊýÊÇÒ»¸öÏß³Ì×èÈûµÄº¯Êý£¬µ÷ÓÃËüµÄº¯Êý½«Ò»Ö±µÈ´ýµ½±»µÈ´ýµÄÏ߳̽áÊøÎªÖ¹£¬µ±º¯Êý·µ»ØÊ±£¬±»µÈ´ýÏ̵߳Ä×ÊÔ´¾Í±»Êջء£

4.Ïß³ÌÈ¡Ïûpthread_cancel()

Ç°ÃæÒѾ­Ìáµ½Ï̵߳÷ÓÃpthread_exit()º¯ÊýÖ÷¶¯ÖÕÖ¹×ÔÉíỊ̈߳¬µ«ÊÇÔںܶàÏß³ÌÓ¦ÓÃÖУ¬¾­³£»áÓöµ½ÔÚ±ðµÄÏß³ÌÖÐÒªÖÕÖ¹ÁíÒ»¸öÏ̵߳ÄÎÊÌ⣬´Ëʱµ÷ÓÃpthread_cancel()º¯ÊýÀ´ÊµÏÖÕâÖÖ¹¦ÄÜ£¬µ«ÔÚ±»È¡ÏûµÄÏ̵߳ÄÄÚ²¿ÐèÒªµ÷ÓÃpthread_setcancel()º¯ÊýºÍpthread_setcanceltype()º¯ÊýÉèÖÃ×Ô¼ºµÄÈ¡Ïû״̬¡£ÀýÈ磬±»È¡ÏûµÄÏ߳̽ÓÊÕµ½ÁíÒ»¸öÏ̵߳ÄÈ¡ÏûÇëÇóÖ®ºó£¬ÊǽÓÊܺ¯ÊýºöÂÔÕâ¸öÇëÇó£»Èç¹ûÊǽÓÊÜ£¬ÔòÔÙÅжÏÁ¢¿Ì²ÉÈ¡ÖÕÖ¹²Ù×÷»¹Êǵȴýij¸öº¯ÊýµÄµ÷Óõȡ£

5.Ï̱߳êʶ·û»ñÈ¡pthread_self()

»ñÈ¡µ÷ÓÃÏ̵߳ıêʶID¡£

´´½¨Ï̵߳ÄʱºòÌáµ½Ò»¸öº¯Êýpthread_self£¬Õâ¸öº¯ÊýʹPOSIXÏ߳̿âÖеÄÒ»¸öº¯Êý£¬Í¨¹ýÕâ¸öº¯Êý¿ÉÒÔ»ñµÃÏ̵߳ÄID£¬¿ÉÊÇÎÒÃÇ´òÓ¡³öÀ´Õâ¸öID»á·¢ÏÖÕâ¸öIDÊÇÒ»¸öºÜ´óµÄÊý×Ö¡£Ã»Óеõ½ÎÒÃÇÏëÏóµÄÒ»¸öÊý×Ö£¬ÆäʵÕâ¸öIDÊÇPOSIXÏ߳̿âÌṩµÄÒ»¸öÊý×Ö£¬¶ølinuxÄÚºËÖÐҲΪÕâ¸öÏß³ÌÌṩÁËÒ»¸öID£¬Õâ¸öID¿ÉÒÔͨ¹ýgettid»ñµÃ£¬gettidÊÇlinuxÄÚºËÌṩµÄÒ»¸öϵͳµ÷Óã¬GlibcûÓзâ×°º¯Êý£¬Ö»ÄÜͨ¹ýϵͳµ÷ÓÃʵÏÖ¡£

POSIX£º
#include <pthread>
pthread_t pthread_self(void);

linuxϵͳµ÷Óãº
#include <sys/types.h>
#include <sys/syscall.h>
pid_t gettid(void)
{
return syscall(SYS_gettid);
}

6.Ïß³ÌÇå³ýpthread_cleanup_push +pthread_cleanup_pop()

Ïß³ÌÖÕÖ¹ÓÐÁ½ÖÖÇé¿ö£ºÕý³£ÖÕÖ¹ºÍ·ÇÕý³£ÖÕÖ¹¡£Ïß³ÌÖ÷¶¯µ÷ÓÃpthread_exit()»òÕß´ÓÏ̺߳¯ÊýÖÐreturn¶¼½«Ê¹Ïß³ÌÕý³£Í˳ö£¬ÕâÊÇ¿ÉÔ¤¼ûµÄÍ˳ö·½Ê½£»·ÇÕý³£ÖÕÖ¹ÊÇÏß³ÌÔÚÆäËüÏ̵߳ĸÉԤϣ¬»òÕßÓÉÓÚ×ÔÉíÔËÐгö´í(±ÈÈç·ÃÎÊ·Ç·¨µØÖ·)¶øÍ˳ö£¬ÕâÖÖÍ˳ö·½Ê½ÊDz»¿ÉÔ¤¼ûµÄ¡£²»ÂÛÊÇ¿ÉÔ¤¼ûµÄÏß³ÌÖÕÖ¹»¹ÊÇÒì³£ÖÕÖ¹£¬¶¼»á´æÔÚ×ÊÔ´ÊͷŵÄÎÊÌ⣬ÈçºÎ±£Ö¤Ïß³ÌÖÕֹʱÄÜ˳ÀûµØÊͷŵô×Ô¼ºËùÕ¼ÓõÄ×ÊÔ´£¬ÊÇÒ»¸ö±ØÐ뿼ÂǵÄÎÊÌâ¡£

´Ópthread_cleanup_push()µÄµ÷Óõ㵽pthread_cleanup_pop()Ö®¼äµÄ³ÌÐò¶ÎÖеÄÖÕÖ¹¶¯×÷(°üÀ¨µ÷ÓÃpthread_exit()ºÍÒì³£ÖÕÖ¹£¬²»°üÀ¨return)¶¼½«Ö´ÐÐpthread_cleanup_push()ËùÖ¸¶¨µÄÇåÀíº¯Êý¡£

/* pthread_clean.cpp */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

/* ±»Çå³ýº¯Êý */
void clean_func(void *arg)
{
printf("Çå³ý£º%s\n",(char *)arg);
//return (void *)0;
}

/* Ï̺߳¯Êý1 */
void *thread_func_A(void *arg)
{
printf("ÎÒÊÇÏ̺߳¯ÊýA£¬ÎÒ½«ÒªÔËÐÐÁË£¡\n");
pthread_cleanup_push (clean_func,(void*)"Ï̺߳¯ÊýAµÚÒ»´Î²Ù×÷Çå³ýº¯Êý");
pthread_cleanup_push (clean_func,(void*)"Ï̺߳¯ÊýAµÚ¶þ´Î²Ù×÷Çå³ýº¯Êý");
if (arg) {
return ((void *)6);
}
pthread_cleanup_pop(1);
pthread_cleanup_pop(0);
return (void *)1;
}
/* Ï̺߳¯Êý2 */
void *thread_func_B(void *arg)
{
printf("ÎÒÊÇÏ̺߳¯ÊýB£¬ÎÒ½«ÒªÔËÐÐÁË£¡\n");
pthread_cleanup_push (clean_func,(void*)"Ï̺߳¯ÊýBµÚÒ»´Î²Ù×÷Çå³ýº¯Êý");
pthread_cleanup_push (clean_func,(void*)"Ï̺߳¯ÊýBµÚ¶þ´Î²Ù×÷Çå³ýº¯Êý");
if (arg) {
return ((void *)7);
}
pthread_cleanup_pop(1);
pthread_cleanup_pop(0);
return (void *)2;
}

int main(int argc, char const *argv[])
{
/* code */
pthread_t tid_a,tid_b;//ÉùÃ÷Ïß³Ìid
int ret;
void *res;
ret = pthread_create (&tid_a,NULL,thread_func_A,(void *)1);
if (ret) {
printf("create thread error\n");
exit(1);
}
ret = pthread_create (&tid_b,NULL, thread_func_B,(void *)0);
if (ret) {
printf("create thread error\n");
exit(1);
}
pthread_join(tid_a,&res);
printf("Ïß³Ìtid_aµÄ·µ»ØÖµÎª£º%d\n",(int *)res);
pthread_join(tid_b,&res);
printf("Ïß³Ìtid_bµÄ·µ»ØÖµÎª£º%d\n",(int *)res);
return 0;


½á¹û£º
xzj@xzj-VirtualBox: ~/development_test/pthread$ ./pthread_clean_main
ÎÒÊÇÏ̺߳¯ÊýB£¬ÎÒ½«ÒªÔËÐÐÁË£¡
Çå³ý£ºÏ̺߳¯ÊýBµÚ¶þ´Î²Ù×÷Çå³ýº¯Êý
ÎÒÊÇÏ̺߳¯ÊýA£¬ÎÒ½«ÒªÔËÐÐÁË£¡
Çå³ý£ºÏ̺߳¯ÊýAµÚ¶þ´Î²Ù×÷Çå³ýº¯Êý
Çå³ý£ºÏ̺߳¯ÊýAµÚÒ»´Î²Ù×÷Çå³ýº¯Êý
Ïß³Ìtid_aµÄ·µ»ØÖµÎª£º6
Ïß³Ìtid_bµÄ·µ»ØÖµÎª£º2

}

×¢Òâ:

1.Linux ¾ÍÊÇÓúêÀ´ÊµÏֵġ£ÕâÒâζ×ÅÕâÁ½¸öº¯Êý±ØÐëͬʱ³öÏÖ£¬²¢ÇÒÊôÓÚͬһ¸öÓï·¨¿é(ͬһº¯ÊýÖÐ)¡£

2. pthread_cleanup_push (clean_func,clean_arg);

......

if(cond)

pthread_cleanup_pop(0);

//ÔÚÈÕ³£±àÂëÖкÜÈÝÒ×·¸ÉÏÃæÕâÖÖ´íÎó¡£ÒòΪ pthread_cleanup_push ºÍ phtread_cleanup_pop µÄʵÏÖÖаü

//º¬ÁË { ºÍ } £¬ËùÒÔ½« pop ·ÅÈë if{} µÄ´úÂë¿éÖУ¬»áµ¼ÖÂÀ¨ºÅÆ¥Åä´íÂÒ£¬×îÖÕ»áÒý·¢±àÒë´íÎó¡£

3.¿ÉÒÔ×¢²á¶à¸öÇåÀíº¯Êý

pthread_cleanup_push (clean_func_1,clean_arg_1)

pthread_cleanup_push (clean_func_2,clean_arg_2)

...

pthread_cleanup_pop(execute_2);

pthread_cleanup_pop(execute_1);

4.´Ó push ºÍ pop µÄÃû×Ö¿ÉÒÔ¿´³ö£¬ÕâÊÇÕ»µÄ·ç¸ñ£¬ºóÈëÏȳö£¬¾ÍÊǺó×¢²áµÄÇåÀíº¯Êý»áÏÈÖ´ÐÐ

ÆäÖÐ pthread_cleanup_pop µÄÓô¦ÊÇ£¬É¾³ý×¢²áµÄÇåÀíº¯Êý¡£Èç¹û²ÎÊýÊÇ·Ç 0 Öµ£¬ÄÇôִÐÐÒ»´Î£¬ÔÙɾ³ýÇåÀíº¯Êý¡£·ñÔòµÄ»°£¬¾ÍÖ±½Óɾ³ýÇåÀíº¯Êý¡£

Ï̵߳ÄÊôÐÔÊôÐÔÉèÖÃ

POSIX Ï߳̿ⶨÒåÁËÏß³ÌÊôÐÔ¶ÔÏó pthread_attr_t £¬Ëü·â×°ÁËÏ̵߳Ĵ´½¨ÕßÄܹ»ÔLÎʺ͸͝µÄÏß³ÌÊôÐÔ¡£Ö÷Òª°üº¬ÀýÈçÒÔÏÂÊôÐÔ£º

×÷ÓÃÓò£¨scope£©

Õ»³ß´ç£¨stack size£©

Õ»µØÖ·£¨stack address£©

ÓÅÏȼ¶£¨priority£©

·ÖÀëµÄ״̬£¨detached state£©

µ÷¶È²ßÂԺͅ¢Êý£¨scheduling policy and parameters£©

³õʼ»¯/Ïú»ÙÏß³ÌÊôÐÔ

Linux¶àÏß³Ìʵ¼ù£¨Èý£©Ï̵߳Ļù±¾ÊôÐÔÉèÖÃAPI

ÉèÖÃÏ̵߳ķÖÀëÊôÐÔ

ÔÚLinuxƽ̨ĬÈÏÇé¿öÏ£¬ËäÈ»¸÷¸öÏß³ÌÖ®¼äÊÇÏ໥¶ÀÁ¢µÄ£¬Ò»¸öÏ̵߳ÄÖÕÖ¹²»»áȥ֪ͨ»òÓ°ÏìÆäËûµÄÏ̡߳£µ«ÊÇÒѾ­ÖÕÖ¹µÄÏ̵߳Ä×ÊÔ´²¢²»»áËæ×ÅÏ̵߳ÄÖÕÖ¹¶øµÃµ½ÊÍ·Å£¬ÎÒÃÇÐèÒªµ÷Óà pthread_join() À´»ñµÃÁíÒ»¸öÏ̵߳ÄÖÕֹ״̬²¢ÇÒÊͷŸÃÏß³ÌËùÕ¼µÄ×ÊÔ´¡££¨ËµÃ÷£ºÏ̴߳¦ÓÚjoinable״̬Ï£©

µ÷Óøú¯ÊýµÄÏ߳̽«¹ÒÆð£¬µÈ´ý th Ëù±íʾµÄÏ̵߳ĽáÊø¡£ thread_return ÊÇÖ¸ÏòÏß³Ì th ·µ»ØÖµµÄÖ¸Õë¡£ÐèҪעÒâµÄÊÇ th Ëù±íʾµÄÏ̱߳ØÐëÊÇ joinable µÄ£¬¼´´¦ÓÚ·Ç detached£¨ÓÎÀ룩״̬£»²¢ÇÒÖ»¿ÉÒÔÓÐΨһµÄÒ»¸öÏ̶߳Ôth µ÷Óà pthread_join() ¡£Èç¹û th ´¦ÓÚ detached ״̬£¬ÄÇô¶Ô th µÄ pthread_join() µ÷Óý«·µ»Ø´íÎó¡£

Èç¹û²»¹ØÐÄÒ»¸öÏ̵߳ĽáÊø×´Ì¬£¬ÄÇôҲ¿ÉÒÔ½«Ò»¸öÏß³ÌÉèÖÃΪ detached ״̬£¬´Ó¶øÈòÙ×÷ϵͳÔÚ¸ÃÏ߳̽áÊøÊ±À´»ØÊÕËüËùÕ¼µÄ×ÊÔ´¡£½«Ò»¸öÏß³ÌÉèÖÃΪdetached ״̬¿ÉÒÔͨ¹ýÁ½ÖÖ·½Ê½À´ÊµÏÖ¡£Ò»ÖÖÊǵ÷ÓÃpthread_detach() º¯Êý£¬¿ÉÒÔ½«Ïß³Ì th ÉèÖÃΪ detached ״̬¡£ÁíÒ»ÖÖ·½·¨ÊÇÔÚ´´½¨Ïß³Ìʱ¾Í½«ËüÉèÖÃΪ detached ״̬£¬Ê×Ïȳõʼ»¯Ò»¸öÏß³ÌÊôÐÔ±äÁ¿£¬È»ºó½«ÆäÉèÖÃΪ detached ״̬£¬×îºó½«Ëü×÷Ϊ²ÎÊý´«ÈëÏ̴߳´½¨º¯Êýpthread_create()£¬ÕâÑùËù´´½¨³öÀ´µÄÏ߳̾ÍÖ±½Ó´¦ÓÚ detached ״̬¡£

linuxÏÂÏ̵߳ķÖÀëºÍ½áºÏÊôÐÔ

µÚÒ»ÖÖ·½Ê½£ºÔÚÏ̵߳÷Óú¯ÊýÀïʹÓÃ×Ó½ø³ÌʹÓÃÒÔϲÙ×÷

pthread_detach(pthread_self())£»
»òÕ߸¸Ï̵߳÷ÓÃʱ¼ÓÈ룺

pthread_detach(thread_id)

µÚ¶þÖÖ·½Ê½£º¾ÍÊÇÔÚ´´½¨Ï̵߳Äʱºò£¬³õʼ»¯Ï̵߳ÄÊôÐÔ

´´½¨ detach Ị̈߳º

pthread_t tid;

pthread_attr_t attr;

pthread_attr_init(&attr);

pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);

pthread_create (&tid, &attr, THREAD_FUNCTION, arg);


×Ü֮ΪÁËÔÚʹÓà pthread ʱ±ÜÃâÏ̵߳Ä×ÊÔ´ÔÚÏ߳̽áÊøÊ±²»Äܵõ½ÕýÈ·ÊÍ·Å£¬´Ó¶ø±ÜÃâ²úÉúDZÔÚµÄÄÚ´æÐ¹Â©ÎÊÌ⣬ÔÚ¶Ô´ýÏ߳̽áÊøÊ±£¬ÒªÈ·±£¸ÃÏ̴߳¦ÓÚ detached ״̬£¬·ñמÍÐèÒªµ÷Óà pthread_join() º¯ÊýÀ´¶ÔÆä½øÐÐ×ÊÔ´»ØÊÕ¡£

Ïß³ÌÊôÐÔµÄÐÞ¸Ä

»¥³âËøÏ߳̿ØÖÆ

Ô­Òò£ºÓÉÓÚÏ̹߳²Ïí½ø³ÌµÄ×ÊÔ´ºÍµØÖ·¿Õ¼ä£¬Òò´ËÔÚ¶ÔÕâЩ×ÊÔ´½øÐвÙ×÷ʱ£¬±ØÐ뿼Âǵ½Ï̼߳ä×ÊÔ´·ÃÎʵÄͬ²½Ó뻥³âÎÊÌâ

Á½ÖÖÏß³Ìͬ²½»úÖÆ£º»¥³âËøºÍÐźÅÁ¿¡£

ÕâÁ½¸öͬ²½»úÖÆ¿ÉÒÔͨ¹ý»¥Ïàµ÷ÓöԷ½À´ÊµÏÖ£¬µ«»¥³âËø¸üÊÊÓÃÓÚͬʱ¿ÉÓõÄ×ÊÔ´ÊÇΨһµÄÇé¿ö£»ÐźÅÁ¿¸üÊÊÓÃÓÚͬʱ¿ÉÓõÄ×ÊԴΪ¶à¸öµÄÇé¿ö¡£

1.»¥³âËø

»¥³âËøÊÇÓÃÒ»ÖÖ¼òµ¥µÄ¼ÓËø·½·¨À´¿ØÖƶԹ²Ïí×ÊÔ´µÄÔ­×Ó²Ù×÷¡£Õâ¸ö»¥³âËøÖ»ÓÐÁ½ÖÖ״̬£¬¼´ÉÏËøºÍ½âËø£¬¿ÉÒÔ°Ñ»¥³âËø¿´×öijÖÖÒâÒåÉϵÄÈ«¾Ö±äÁ¿¡£ÔÚͬһ¸öʱ¿ÌÖ»ÄÜÓÐÒ»¸öÏß³ÌÕÆÎÕij¸ö»¥³âËø£¬ÓµÓÐÉÏËø×´Ì¬µÄÏß³ÌÄܹ»¶Ô¹²Ïí×ÊÔ´½øÐвÙ×÷¡£ÈôÆäËûÏß³ÌÏ£ÍûÉÏËøÒ»¸öÒѾ­±»ÉÏËøµÄ»¥³âËø£¬Ôò¸ÃÏ߳̾ͻᱻ¹ÒÆð£¬Ö±µ½ÉÏËøµÄÏß³ÌÊͷŵô»¥³âËøÎªÖ¹¡£¿ÉÒÔ˵£¬Õâ°Ñ»¥³âËø±£Ö¤ÈÃÿ¸öÏ̶߳Թ²Ïí×ÊÔ´°´Ë³Ðò½øÐÐÔ­×Ó²Ù×÷¡£

»¥³âËø»úÖÆµÄ»ù±¾º¯ÊýÈçÏ£º

¡ñ »¥³âËø³õʼ»¯£ºpthread_mutex_init()

¡ñ »¥³âËøÉÏËø£ºpthread_mutex_lock()

¡ñ »¥³âËøÅжÏÉÏËø£ºpthread_mutex_trylock()

¡ñ »¥³âËø½âËø£ºpthread_mutex_unlock()

¡ñ Ïû³ý»¥³âËø£ºpthread_mutex_destroy()

»¥³âËø¿ÉÒÔ·ÖΪ¿ìËÙ»¥³âËø¡¢µÝ¹é»¥³âËøºÍ¼ì´í»¥³âËø¡£Õâ3ÖÖËøµÄÇø±ðÖ÷ÒªÔÚÓÚÆäËüδռÓл¥³âËøµÄÏß³ÌÔÚÏ£ÍûµÃµ½»¥³âËøÊ±ÊÇ·ñÐèÒª×èÈûµÈ´ý¡£

1¡¢¿ìËÙ»¥³âËøÊÇÖ¸µ÷ÓÃÏ̻߳á×èÈûÖ±ÖÁÓµÓл¥³âËøµÄÏ߳̽âËøÎªÖ¹£»

2¡¢µÝ¹é»¥³âËøÄܹ»³É¹¦µØ·µ»Ø£¬²¢ÇÒÔö¼Óµ÷ÓÃÏß³ÌÔÚ»¥³âÉϼÓËøµÄ´ÎÊý

3¡¢¼ì´í»¥³âËøÔòΪ¿ìËÙ»¥³âËøµÄ·Ç×èÈû°æ±¾£¬Ëü»áÁ¢¼´·µ»Ø²¢·µ»ØÒ»¸ö´íÎóÐÅÏ¢¡£

ĬÈÏÊôÐÔΪ¿ìËÙ»¥³âËø¡£

»¥³âËøµÄ³õʼ»¯

»¥³âËøµÄ²Ù×÷

2.ÐźÅÁ¿

ÐźÅÁ¿¾ÍÊDzÙ×÷ϵͳÖжàÓõ½µÄPVÔ­×Ó²Ù×÷£¬Ëü¹ã·ºÓ¦ÓÃÓÚ½ø³Ì»òÏ̼߳äµÄͬ²½Ó뻥³â¡£ÐźÅÁ¿±¾ÖÊÉÏÊÇÒ»¸ö·Ç¸ºµÄÕûÊý¼ÆÊýÆ÷£¬Ëü±»ÓÃÀ´¿ØÖƶԹ«¹²×ÊÔ´µÄ·ÃÎÊ

PVÔ­×Ó²Ù×÷Ö÷ÒªÓÃÓÚ½ø³Ì»òÏ̼߳äµÄͬ²½ºÍ»¥³âÕâÁ½ÖÖµäÐÍÇé¿ö¡£µ±ÓÃÓÚ»¥³â£¬¼¸¸ö½ø³Ì£¨»òỊ̈߳©ÍùÍùÖ»ÉèÖÃÒ»¸öÐźÅÁ¿sem£¬Æä²Ù×÷Á÷³ÌÈçͼ1Ëùʾ¡£µ±ÐźÅÁ¿ÓÃÓÚͬ²½²Ù×÷ʱ£¬ÍùÍù»áÉèÖöà¸öÐźÅÁ¿£¬²¢°²ÅŲ»Í¬µÄ³õʼֵÀ´ÊµÏÖËüÃÇÖ®¼äµÄ˳ÐòÖ´ÐУ¬Æä²Ù×÷Á÷³ÌÈçͼ2Ëùʾ¡£

LinuxʵÏÖÁËPosixµÄÎÞÃûÐźÅÁ¿£¬Ö÷ÒªÓÃÓÚÏ̼߳äµÄ»¥³âÓëͬ²½¡£ÕâÀïÖ÷Òª½éÉܼ¸¸ö³£¼ûº¯Êý£º

¡ñ sem_init()ÓÃÓÚ´´½¨Ò»¸öÐźÅÁ¿£¬²¢³õʼ»¯ËüµÄÖµ¡£

¡ñ sem_wait()ºÍsem_trywait()¶¼Ï൱ÓÚP²Ù×÷£¬ÔÚÐźÅÁ¿>0ʱ£¬ËüÃÇÄܽ«ÐźÅÁ¿µÄÖµ¼õ1¡£Á½ÕßµÄÇø±ðÔÚÓÚÐźÅÁ¿<0ʱ£¬sem_wait(0½«»á×èÈû½ø³Ì£¬¶øsem_trywaitÔò»áÁ¢¼´·µ»Ø¡£

¡ñ sem_post()Ï൱ÓÚV²Ù×÷£¬Ëü½«ÐźÅÁ¿µÄÖµ¼Ó1£¬Í¬Ê±·¢³öÐźÅÀ´»½ÐѵȴýµÄ½ø³Ì¡£

¡ñ sem_getvalue()ÓÃÓڵõ½ÐźÅÁ¿µÄÖµ¡£

¡ñ sem_destroy()ÓÃÓÚɾ³ýÐźÅÁ¿¡£

ÐźÅÁ¿µÄ³õʼ»¯²Ù×÷

ÐźÅÁ¿µÄp¡¢v¡¢Ïú»ÙµÈ²Ù×÷

ÔÚûÓмÓÈëÈκÎͬ²½»¥³âµÄÇé¿öÏ¡ª¡ªÏ̶߳Ô×ÊÔ´µÄ²Ù×÷ÊÇËæ»úµÄ

/* pthread_suiji.cpp */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include<time.h>

static int key = 1;//³õʼ»¯¾²Ì¬±äÁ¿--Ï̲߳Ù×÷µÄ×ÊÔ´

void *thread_func(void *argv)
{
printf ("I am thread_%s,my thread_id is: %u\n",(char *)argv,(unsigned int)pthread_self());
for (int i = 0; i < 5; i++) {
/* code */
printf("start:key=%d in %s\n",key,(char *)argv);
//srand(time(0));
int seconds = rand()%6+1;
sleep(seconds);
key+= seconds;
printf("Ïà¼Ó£º%dÖ®ºó£¬end:key= %d in %s\n",seconds,key, (char *)argv);

}
pthread_exit((char *)argv);
}

int main(int argc, char const *argv[])
{
/* code */
/* code */
pthread_t tid_a,tid_b;//ÉùÃ÷Ïß³Ìid
int ret;
void *thread_id1;
void *thread_id2;
/* ´´½¨Ị̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐthread_aº¯Êý£¬²¢ÇÒ´«µÝÒ»¸ö²ÎÊýΪµ±Ç°Ï̵߳ıêʶ·û */
ret = pthread_create (&tid_a,NULL,thread_func,(void *)"A");
if (ret) {
printf("create thread error\n");
exit(1);
}
/* ´´½¨Ị̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐthread_bº¯Êý£¬²¢ÇÒ´«µÝÒ»¸ö²ÎÊýΪµ±Ç°Ï̵߳ıêʶ·û */
ret = pthread_create (&tid_b,NULL,thread_func,(void *)"B");
if (ret) {
printf("create thread error\n");
exit(1);
}
/* µÈ´ýÁ½¸ö½ø³Ì¶¼Í˳öºó£¬ÔÚÍ˳öÖ÷Ị̈߳¨main£© */
pthread_join(tid_a,&thread_id1);
pthread_join(tid_b,&thread_id2);
printf("Ïß³Ì%sÒѾ­½áÊø£¬thread_id£º%u-----Ïß³Ì%sÒѾ­½áÊø£¬thread_id£º%u\n",(char *)thread_id1,(unsigned int)tid_a,(char *)thread_id2,(unsigned int)tid_b);
return 0;
}

½á¹û£º
xzj@xzj-VirtualBox: ~/development_test/pthread$ g++ -o pthread_suiji_main pthread_suiji.cpp -lpthread
xzj@xzj-VirtualBox: ~/development_test/pthread$ ./pthread_suiji_main
I am thread_B,my thread_id is: 4046087936
start:key=1 in B
I am thread_A,my thread_id is:4054480640
start:key=1 in A
Ïà¼Ó£º2Ö®ºó£¬end:key=3 in B
start:key=3 in B
Ïà¼Ó£º5Ö®ºó£¬end:key=8 in A
start:key=8 in A
Ïà¼Ó£º4Ö®ºó£¬end:key=12 in B
start:key=12 in B
Ïà¼Ó£º2Ö®ºó£¬end:key=14 in A
start:key=14 in A
Ïà¼Ó£º2Ö®ºó£¬end:key=16 in A
start:key=16 in A
Ïà¼Ó£º6Ö®ºó£¬end:key=22 in B
start:key=22 in B
Ïà¼Ó£º1Ö®ºó£¬end:key=23 in B
start:key=23 in B
Ïà¼Ó£º5Ö®ºó£¬end:key=28 in A
start:key=28 in A
Ïà¼Ó£º2Ö®ºó£¬end:key=30 in A
Ïà¼Ó£º4Ö®ºó£¬end:key=34 in B
Ïß³ÌAÒѾ­½áÊø£¬thread_id£º4054480640-----Ïß³ÌBÒѾ­½áÊø£¬thread_id£º4046087936

¼ÓÈ뻥³âËø--Ïß³ÌÖ®¼ä¶Ôͬһ¸ö×ÊÔ´µÄ²Ù×÷ÓëÕ¼ÓÐÊÇ»¥³âµÄ£¡

×÷ÓãºÊµÏÖÔ­±¾¶ÀÁ¢ÇÒÎÞÐòµÄ¶à¸öÏß³ÌÖ®¼ä°´ÕÕ˳ÐòÖ´ÐÐ

/* pthread_suiji.cpp */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include<time.h>

static int key = 1;//³õʼ»¯¾²Ì¬±äÁ¿--Ï̲߳Ù×÷µÄ×ÊÔ´
pthread_mutex_t lock;//¶¨Ò廥³âËø

void *thread_func(void *argv)
{
/* Ïß³ÌÉÏËø */
int lock_mutex = pthread_mutex_lock(&lock);
if (lock_mutex) {
printf("»¥³âËøÉÏËø´íÎó");
pthread_exit((char *)argv);
}
printf ("I am thread_%s,my thread_id is: %u\n",(char *)argv,(unsigned int)pthread_self());
for (int i = 0; i < 5; i++) {
/* code */
printf ("start:key=%d in %s\n",key,(char *)argv);
//srand(time(0));
int seconds = rand()%6+1;
sleep(seconds);
key+= seconds;
printf("Ïà¼Ó£º%dÖ®ºó£¬end: key=%d in %s\n", seconds,key,(char *)argv);

}
pthread_mutex_unlock(&lock);//»¥³âËø½âËø
pthread_exit((char *)argv);
}

int main(int argc, char const *argv[])
{
/* code */
/* code */
pthread_t tid_a,tid_b;//ÉùÃ÷Ïß³Ìid
int ret;
void *thread_id1;
void *thread_id2;
/* ³õʼ»¯»¥³âËø */
int init_mutex = pthread_mutex_init (&lock,NULL);//ĬÈÏÊÇPTHREAD_MUTEX_INITIALIZER ¿ìËÙ»¥³âËø
if (init_mutex) {
printf("³õʼ»¯»¥³âËøÊ§°Ü");
exit(1);
}
/* ´´½¨Ị̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐthread_aº¯Êý£¬²¢ÇÒ´«µÝÒ»¸ö²ÎÊýΪµ±Ç°Ï̵߳ıêʶ·û */
ret = pthread_create(&tid_a,NULL,thread_func,(void *)"A");
if (ret) {
printf("create thread error\n");
exit(1);
}
/* ´´½¨Ị̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐthread_bº¯Êý£¬²¢ÇÒ´«µÝÒ»¸ö²ÎÊýΪµ±Ç°Ï̵߳ıêʶ·û */
ret = pthread_create (&tid_b,NULL,thread_func,(void *)"B");
if (ret) {
printf("create thread error\n");
exit(1);
}
/* µÈ´ýÁ½¸ö½ø³Ì¶¼Í˳öºó£¬ÔÚÍ˳öÖ÷Ị̈߳¨main£© */
pthread_join(tid_a,&thread_id1);
pthread_join(tid_b,&thread_id2);
printf("Ïß³Ì%sÒѾ­½áÊø£¬thread_id£º%u-----Ïß³Ì%sÒѾ­½áÊø£¬thread_id£º%u\n",(char *)thread_id1, (unsigned int)tid_a,(char *)thread_id2,(unsigned int)tid_b);
pthread_mutex_destroy(&lock);
return 0;
}

½á¹û£º
xzj@xzj-VirtualBox: ~/development_test/pthread$ g++ -o pthread_suiji_main pthread_suiji.cpp -lpthread
xzj@xzj-VirtualBox:~/development_test/pthread$ ./pthread_suiji_main
I am thread_B,my thread_id is:2425865984
start:key=1 in B
Ïà¼Ó£º2Ö®ºó£¬end:key=3 in B
start:key=3 in B
Ïà¼Ó£º5Ö®ºó£¬end:key=8 in B
start:key=8 in B
Ïà¼Ó£º4Ö®ºó£¬end:key=12 in B
start:key=12 in B
Ïà¼Ó£º2Ö®ºó£¬end:key=14 in B
start:key=14 in B
Ïà¼Ó£º6Ö®ºó£¬end:key=20 in B
I am thread_A,my thread_id is:2434258688
start:key=20 in A
Ïà¼Ó£º2Ö®ºó£¬end:key=22 in A
start:key=22 in A
Ïà¼Ó£º5Ö®ºó£¬end:key=27 in A
start:key=27 in A
Ïà¼Ó£º1Ö®ºó£¬end:key=28 in A
start:key=28 in A
Ïà¼Ó£º4Ö®ºó£¬end:key=32 in A
start:key=32 in A
Ïà¼Ó£º2Ö®ºó£¬end:key=34 in A
Ïß³ÌAÒѾ­½áÊø£¬thread_id£º2434258688-----Ïß³ÌBÒѾ­½áÊø£¬thread_id£º2425865984

 

Ïß³ÌÖ®Éú²úÕß¡ª¡ªÏû·ÑÕß

/* pthread_semaphore_lock.cpp */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <fcntl.h> //ÎļþµÄ²Ù×÷
#include <semaphore.h>
#include <sys/ipc.h> //ÐźÅÁ¿¡¢¹²ÏíÄÚ´æ¡¢ÏûÏ¢¶ÓÁж¼»áÓõ½Õâ¸öÍ·Îļþ
#include <errno.h>
#include <sys/types.h>//mkfifoÐèÒª´ËÍ·Îļþ
#include <sys/stat.h>//mkfifoÐèÒª´ËÍ·Îļþ

#define UNIT_SIZE 512 //ÿ¸öµ¥ÔªµÄ×Ö½Ú´óС
#define XZJ_FIFO "fifo"

int fd;//¹ÜµÀÃèÊö·û
sem_t mutex;//ÐźÅÁ¿»¥³â
sem_t empty,full;//ÐźÅÁ¿Í¬²½£¬emptyΪ»º³å³Ø¿ÕµÄµ¥Ôª£¬fullΪ»º³å³ØÊý¾ÝÕ¼Óõĵ¥Ôª£¬²¢ÇÒ£ºempty+full=1£»

/* Éú²úÕßÏ̺߳¯Êý */
void *producter(void *argv)
{
int write_size;
char write_buffer[UNIT_SIZE] = {0};
while (1)
{
/* ¶Ô¹ÜµÀ½øÐÐÑ­»·Ð´ */
sem_wait(&empty);//½øÐÐÐźÅÁ¿µÄP²Ù×÷
sem_wait(&mutex);//½øÐÐÐźÅÁ¿µÄP²Ù×÷
printf("ÕâÀïÊÇÉú²úÕßỊ̈߳º\n");
printf("ÇëÊäÈë×Ö·û´®Îı¾(ÊäÈëexit±íʾÀ뿪)£º\n");
gets(write_buffer);
printf("ÄãÒª½«´ËÊý¾Ý%sдÈëµ½¹ÜµÀÖУ¡\n",write_buffer);
if (-1 == (write_size = write(fd,write_buffer,UNIT_SIZE))) {
if (errno == EAGAIN) {
printf("the fifo has not been read!please try again!");
}
}else {
printf("ÎÒÊÇдỊ̈߳¬write %d into FIFO\n", strlen(write_buffer));
printf(" |\n");
printf(" |\n");
printf(" |\n");
printf(" |\n");
printf(" |\n");
printf(" |\n");
}
sem_post(&full);//½øÐÐÐźÅÁ¿µÄv²Ù×÷
sem_post(&mutex);//½øÐÐÐźÅÁ¿µÄv²Ù×÷
if (0 == (strncmp(write_buffer,"exit",4))) {
break;//Ìø³öÑ­»·
}
}
pthread_exit(NULL);

}
/* Ïû·ÑÕßÏ̺߳¯Êý */
void *customer(void *argv)
{
int read_size;
char read_buffer[UNIT_SIZE] = {0};
while (1)
{
/* ¶Ô¹ÜµÀ½øÐÐÑ­»·¶Á */
sem_wait(&full);//½øÐÐÐźÅÁ¿µÄP²Ù×÷
sem_wait(&mutex);//½øÐÐÐźÅÁ¿µÄP²Ù×÷
printf("ÕâÀïÊÇÏû·ÑÕßỊ̈߳º\n");
memset(read_buffer,0,UNIT_SIZE);//Çå¿ÕÊý¾Ý
if (-1 == (read_size = read(fd,read_buffer,UNIT_SIZE))) {
if (errno == EAGAIN) {
printf("the fifo has no datas!please try again!");
}
}else {
printf("ÎÒÊǶÁỊ̈߳¬´ÓFIFO¶ÁµÄÄÚÈÝΪ£º %s \n",read_buffer);
printf ("*********************************\n");
}
sem_post(&empty);//½øÐÐÐźÅÁ¿µÄv²Ù×÷
sem_post(&mutex);//½øÐÐÐźÅÁ¿µÄv²Ù×÷
if (0 == (strncmp(read_buffer,"exit",4))) {
break;//Ìø³öÑ­»·
}
}
pthread_exit(NULL);
}
int main(int argc, char const *argv[])
{
/* code */
pthread_t thread_producter_id, thread_customer_id;//Éú²úÕßÓëÏû·ÑÕߵıêʶ·û
int ret;
//char buffer[UNIT_SIZE];
if (-1 == access(XZJ_FIFO,F_OK)) {
//µ±Îļþ²»´æÔÚʱ£¬´´½¨Îļþ
if ((0 > mkfifo(XZJ_FIFO,0777)) && (errno != EEXIST)) {
printf("create fifo file error\n");
exit(1);
}
}
fd = open(XZJ_FIFO,O_RDWR);//¼ÇµÃclose
//ÒÔֻдֻ¶ÁµÄ·½Ê½´ò¿ª¹ÜµÀ
if (-1 == fd) {
printf("open fifo file error");
exit(1);
}
/* ³õʼ»¯ÐźÅÁ¿ */
ret = sem_init(&mutex,0,1);//³õʼ»¯Ïß³ÌÖ®¼äµÄ»¥³âÁ¿£¬ÖµÎª1
ret+= sem_init(&empty,0,1);
ret+= sem_init(&full,0,0);
if (ret) {
printf("ÐźÅÁ¿³õʼ»¯´íÎó\n");
exit(1);
}
/* ´´½¨Éú²úÕßỊ̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐproducterº¯Êý */
ret = pthread_create (&thread_producter_id,NULL,producter,NULL);
if (ret) {
printf ("create thread error\n");
exit(1);
}
/* ´´½¨Ïû·ÑÕßỊ̈߳¬Ê¹µÃ¸ÃÏß³ÌÖ´ÐÐcustomerº¯Êý */
ret = pthread_create (&thread_customer_id,NULL,customer,(void *)"B");
if (ret) {
printf("create thread error\n");
exit(1);
}
/* µÈ´ýÁ½¸ö½ø³Ì¶¼Í˳öºó£¬ÔÚÍ˳öÖ÷Ị̈߳¨main£© */
pthread_join(thread_producter_id,NULL);
pthread_join(thread_customer_id,NULL);
close(fd);//¹Ø±Õ¹ÜµÀÃèÊö·û
return 0;
}

 

Ḭ̈߳²È«

Ö¸¶à¸öÏß³ÌÔÚÖ´ÐÐͬһ¶Î´úÂëµÄʱºò²ÉÓüÓËø»úÖÆ£¬Ê¹Ã¿´ÎµÄÖ´Ðнá¹ûºÍµ¥Ïß³ÌÖ´ÐеĽá¹û¶¼ÊÇÒ»ÑùµÄ£¬¶øÇÒÆäËûµÄ±äÁ¿µÄÖµÒ²ºÍÔ¤ÆÚµÄÊÇÒ»ÑùµÄ£¬²»´æÔÚÖ´ÐгÌÐòʱ³öÏÖÒâÍâ½á¹û¡££¨±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔ£©

Ï̲߳»°²È«

¾ÍÊDz»ÌṩÊý¾Ý·ÃÎʱ£»¤£¬ÓпÉÄܳöÏÖ¶à¸öÏß³ÌÏȺó¸ü¸ÄÊý¾ÝÔì³ÉËùµÃµ½µÄÊý¾ÝÊÇÔàÊý¾Ý¡£

1¡¢ÒýÆðḬ̈߳²È«ÎÊÌâµÄÔ­Òò£º

Ḭ̈߳²È«ÎÊÌâ¶¼ÊÇÓÉÈ«¾Ö±äÁ¿¼°¾²Ì¬±äÁ¿ÒýÆðµÄ¡£

Èôÿ¸öÏß³ÌÖжÔÈ«¾Ö±äÁ¿¡¢¾²Ì¬±äÁ¿Ö»ÓжÁ²Ù×÷£¬¶øÎÞд²Ù×÷£¬Ò»°ãÀ´Ëµ£¬Õâ¸öÈ«¾Ö±äÁ¿ÊÇḬ̈߳²È«µÄ£»ÈôÓжà¸öÏß³ÌͬʱִÐÐд²Ù×÷£¬Ò»°ã¶¼ÐèÒª¿¼ÂÇÏß³Ìͬ²½£¬·ñÔòµÄ»°¾Í¿ÉÄÜÓ°ÏìḬ̈߳²È«¡£

2¡¢½â¾ö¶àÏ̲߳¢·¢·ÃÎÊ×ÊÔ´°²È«ÎÊÌâµÄ·½·¨£¬ÊµÏÖÏß³Ìͬ²½µÄ·½·¨£º

ÐźÅÁ¿

»¥³âËø

¶ÁÐ´Ëø

Ìõ¼þ±äÁ¿

ͬ²½µÄǰÌ᣺

1£¬±ØÐëÒªÓÐÁ½¸ö»òÕßÁ½¸öÒÔÉϵÄÏß³Ì

2£¬±ØÐëÊǶà¸öÏß³ÌʹÓÃͬһ¸öËø

±ØÐ뱣֤ͬ²½ÖÐÖ»ÄÜÓÐÒ»¸öÏß³ÌÔÚÔËÐÐ

ºÃ´¦£º½â¾öÁ˶àÏ̵߳ݲȫÎÊÌâ

±×¶Ë£º¶à¸öÏß³ÌÐèÒªÅжÏËø£¬½ÏΪÏûºÄ×ÊÔ´¡¢ÇÀËøµÄ×ÊÔ´¡£

×¢Ò⣺ÔÚµ¥Ï̻߳·¾³Ï£¬Ã»ÓС°Ḭ̈߳²È«¡±ºÍ¡°·ÇḬ̈߳²È«¡±µÄ¸ÅÄî¡£

ËÀËøÊÇʲô£¿

ËùνËÀËø£ºÊÇÖ¸Á½¸ö»òÁ½¸öÒÔÉϵĽø³ÌÔÚÖ´Ðйý³ÌÖУ¬ÒòÕù¶á×ÊÔ´¶øÔì³ÉµÄÒ»ÖÖ»¥ÏàµÈ´ýµÄÏÖÏó£¬ÈôÎÞÍâÁ¦×÷Óã¬ËüÃǶ¼½«ÎÞ·¨ÍƽøÏÂÈ¥¡£´Ëʱ³ÆÏµÍ³´¦ÓÚËÀËø×´Ì¬»òϵͳ²úÉúÁËËÀËø£¬ÕâЩÓÀÔ¶ÔÚ»¥ÏàµÈ´ýµÄ½ø³Ì³ÆÎªËÀËø½ø³Ì¡£ÓÉÓÚ×ÊÔ´Õ¼ÓÃÊÇ»¥³âµÄ£¬µ±Ä³¸ö½ø³ÌÌá³öÉêÇë×ÊÔ´ºó£¬Ê¹µÃÓйؽø³ÌÔÚÎÞÍâÁ¦Ð­ÖúÏ£¬ÓÀÔ¶·ÖÅä²»µ½±ØÐèµÄ×ÊÔ´¶øÎÞ·¨¼ÌÐøÔËÐУ¬Õâ¾Í²úÉúÁËÒ»ÖÖÌØÊâÏÖÏóËÀËø¡£

ËÀËøµÄ±ØÒªÌõ¼þ

ËäÈ»½ø³ÌÔÚÔËÐйý³ÌÖУ¬¿ÉÄÜ·¢ÉúËÀËø£¬µ«ËÀËøµÄ·¢ÉúÒ²±ØÐë¾ß±¸Ò»¶¨µÄÌõ¼þ£¬ËÀËøµÄ·¢Éú±ØÐë¾ß±¸ÒÔÏÂËĸö±ØÒªÌõ¼þ¡£

1£©»¥³âÌõ¼þ£ºÖ¸½ø³Ì¶ÔËù·ÖÅäµ½µÄ×ÊÔ´½øÐÐÅÅËüÐÔʹÓ㬼´ÔÚÒ»¶Îʱ¼äÄÚij×ÊÔ´Ö»ÓÉÒ»¸ö½ø³ÌÕ¼Óá£Èç¹û´Ëʱ»¹ÓÐÆäËü½ø³ÌÇëÇó×ÊÔ´£¬ÔòÇëÇóÕßÖ»Äܵȴý£¬Ö±ÖÁÕ¼ÓÐ×ÊÔ´µÄ½ø³ÌÓñÏÊÍ·Å¡£

2£©ÇëÇóºÍ±£³ÖÌõ¼þ£ºÖ¸½ø³ÌÒѾ­±£³ÖÖÁÉÙÒ»¸ö×ÊÔ´£¬µ«ÓÖÌá³öÁËеÄ×ÊÔ´ÇëÇ󣬶ø¸Ã×ÊÔ´Òѱ»ÆäËü½ø³ÌÕ¼ÓУ¬´ËʱÇëÇó½ø³Ì×èÈû£¬µ«ÓÖ¶Ô×Ô¼ºÒÑ»ñµÃµÄÆäËü×ÊÔ´±£³Ö²»·Å¡£

3£©²»°þ¶áÌõ¼þ£ºÖ¸½ø³ÌÒÑ»ñµÃµÄ×ÊÔ´£¬ÔÚδʹÓÃÍê֮ǰ£¬²»Äܱ»°þ¶á£¬Ö»ÄÜÔÚʹÓÃÍêʱÓÉ×Ô¼ºÊÍ·Å¡£

4£©Ñ­»·µÈ´ýÌõ¼þ£ºÖ¸ÔÚ·¢ÉúËÀËøÊ±£¬±ØÈ»´æÔÚÒ»¸ö½ø³Ì¡ª¡ª×ÊÔ´µÄ»·ÐÎÁ´£¬¼´½ø³Ì¼¯ºÏ{P0£¬P1£¬P2£¬¡¤¡¤¡¤£¬Pn}ÖеÄP0ÕýÔڵȴýÒ»¸öP1Õ¼ÓõÄ×ÊÔ´£»P1ÕýÔڵȴýP2Õ¼ÓõÄ×ÊÔ´£¬¡­¡­£¬PnÕýÔڵȴýÒѱ»P0Õ¼ÓõÄ×ÊÔ´¡£

ËÀËøµÄÀý×Ó£º

1¡¢Ïß³ÌAÓÐX×ÊÔ´£¬ÐèÒªY×ÊÔ´£¬¶øÏß³ÌBÓÐY×ÊÔ´£¬ÐèÒªX×ÊÔ´£¬AºÍB¶¼Ôڵȴý»¥ÏàÊÍ·Å×ÊÔ´£¬´Ó¶øÔì³ÉÁËËûÃÇÖ®¼äµÄ×ÊÔ´»ñÈ¡²»µ½ÓÖ²»ÊÍ·ÅÒÑ»ñÈ¡µÄ×ÊÔ´µ¼ÖÂËÀËø¡£

2¡¢µÝ¹éËÀËø£ºÔڵݹéÁ´ÉÏÃæµÄ·½·¨ÉϼÓËø¿Ï¶¨»á³öÏÖËÀËø

ÔÚϵͳÖÐÒѾ­³öÏÖËÀËøºó£¬Ó¦¸Ã¼°Ê±¼ì²âµ½ËÀËøµÄ·¢Éú£¬²¢²ÉÈ¡Êʵ±µÄ´ëÊ©À´½â³ýËÀËø¡£Ä¿Ç°´¦ÀíËÀËøµÄ·½·¨¿É¹é½áΪÒÔÏÂËÄÖÖ£º

Ô¤·ÀËÀËø

ÕâÊÇÒ»Öֽϼòµ¥ºÍÖ±¹ÛµÄÊÂÏÈÔ¤·ÀµÄ·½·¨¡£·½·¨ÊÇͨ¹ýÉèÖÃijЩÏÞÖÆÌõ¼þ£¬È¥ÆÆ»µ²úÉúËÀËøµÄËĸö±ØÒªÌõ¼þÖеÄÒ»¸ö»òÕß¼¸¸ö£¬À´Ô¤·À·¢ÉúËÀËø¡£Ô¤·ÀËÀËøÊÇÒ»ÖÖ½ÏÒ×ʵÏֵķ½·¨£¬Òѱ»¹ã·ºÊ¹Óᣵ«ÊÇÓÉÓÚËùÊ©¼ÓµÄÏÞÖÆÌõ¼þÍùÍùÌ«Ñϸñ£¬¿ÉÄܻᵼÖÂϵͳ×ÊÔ´ÀûÓÃÂʺÍϵͳÍÌÍÂÁ¿½µµÍ¡£

±ÜÃâËÀËø

¸Ã·½·¨Í¬ÑùÊÇÊôÓÚÊÂÏÈÔ¤·ÀµÄ²ßÂÔ£¬µ«Ëü²¢²»ÐëÊÂÏȲÉÈ¡¸÷ÖÖÏÞÖÆ´ëÊ©È¥ÆÆ»µ²úÉúËÀËøµÄµÄËĸö±ØÒªÌõ¼þ£¬¶øÊÇÔÚ×ÊÔ´µÄ¶¯Ì¬·ÖÅä¹ý³ÌÖУ¬ÓÃijÖÖ·½·¨È¥·Àֹϵͳ½øÈë²»°²È«×´Ì¬£¬´Ó¶ø±ÜÃâ·¢ÉúËÀËø¡££¨°²È«×´Ì¬¡¢ÒøÐмÒËã·¨£©

±ÜÃâËÀËøµÄ·½·¨£º

¼ÓËøË³Ðò

¼ÓËøÊ±ÏÞ

ËÀËø¼ì²â

½âÊÍÈýÖÖ±ÜÃâËÀËøµÄ·½·¨

¼ì²âËÀËø

ÕâÖÖ·½·¨²¢²»ÐëÊÂÏȲÉÈ¡ÈκÎÏÞÖÆÐÔ´ëÊ©£¬Ò²²»±Ø¼ì²éϵͳÊÇ·ñÒѾ­½øÈë²»°²È«Çø£¬´Ë·½·¨ÔÊÐíϵͳÔÚÔËÐйý³ÌÖз¢ÉúËÀËø¡£µ«¿Éͨ¹ýϵͳËùÉèÖõļì²â»ú¹¹£¬¼°Ê±µØ¼ì²â³öËÀËøµÄ·¢Éú£¬²¢¾«È·µØÈ·¶¨ÓëËÀËøÓйصĽø³ÌºÍ×ÊÔ´£¬È»ºó²ÉÈ¡Êʵ±´ëÊ©£¬´ÓϵͳÖн«ÒÑ·¢ÉúµÄËÀËøÇå³ýµô¡££¨ËÀËø¶¨Àí»¯¼ò×ÊÔ´·ÖÅäͼ£©

½â³ýËÀËø

ÕâÊÇÓë¼ì²âËÀËøÏàÅäÌ×µÄÒ»ÖÖ´ëÊ©¡£µ±¼ì²âµ½ÏµÍ³ÖÐÒÑ·¢ÉúËÀËøÊ±£¬Ð뽫½ø³Ì´ÓËÀËø×´Ì¬ÖнâÍѳöÀ´¡£³£ÓõÄʵʩ·½·¨Êdz·Ïú»ò¹ÒÆðһЩ½ø³Ì£¬ÒﱋȯÊÕһЩ×ÊÔ´£¬ÔÙ½«ÕâЩ×ÊÔ´·ÖÅ䏸ÒÑ´¦ÓÚ×èÈû״̬µÄ½ø³Ì£¬Ê¹Ö®×ªÎª¾ÍÐ÷״̬£¬ÒÔ¼ÌÐøÔËÐС£ËÀËøµÄ¼ì²âºÍ½â³ý´ëÊ©£¬ÓпÉÄÜʹϵͳ»ñµÃ½ÏºÃµÄ×ÊÔ´ÀûÓÃÂʺÍÍÌÍÂÁ¿£¬µ«ÔÚʵÏÖÉÏÄѶÈÒ²×î´ó¡££¨×ÊÔ´°þ¶á·¨£¬³·Ïú½ø³Ì·¨£¬½ø³Ì»ØÍË·¨£©

¼¸ÖÖͬ²½»úÖÆÖУ¬¸÷×ÔµÄÓÅȱµã

ÁÙ½çÇø²»ÊÇÄں˶ÔÏó£¬Ö»ÄÜÓÃÓÚ½ø³ÌÄÚ²¿µÄÏß³Ìͬ²½¡£

»¥³â¡¢ÐźÅÁ¿ÊÇÄں˶ÔÏó¿ÉÒÔÓÃÓÚ²»Í¬½ø³ÌÖ®¼äµÄÏß³Ìͬ²½¡£

»¥³âÆäʵÊÇÐźÅÁ¿µÄÒ»ÖÖÌØÊâÐÎʽ¡£

»¥³â¿ÉÒÔ±£Ö¤ÔÚijһʱ¿ÌÖ»ÓÐÒ»¸öÏ߳̿ÉÒÔÓµÓÐÁÙ½ç×ÊÔ´¡£

ÐźÅÁ¿¿ÉÒÔ±£Ö¤ÔÚijһʱ¿ÌÓÐÖ¸¶¨ÊýÄ¿µÄÏ߳̿ÉÒÔÓµÓÐÁÙ½ç×ÊÔ´¡£

×¢Ò⣺

1¡¢ÁÙ½çÇøºÍ»¥³âÁ¿¶¼ÓС°Ïß³ÌËùÓÐȨ¡±µÄ¸ÅÄËùÒÔËüÃÇÊDz»ÄÜÓÃÀ´ÊµÏÖÏ̼߳äµÄͬ²½µÄ£¬Ö»ÄÜÓÃÀ´ÊµÏÖ»¥³â¡£

2¡¢Ê¼þºÍÐźÅÁ¿¶¼¿ÉÒÔʵÏÖÏ̺߳ͽø³Ì¼äµÄ»¥³âºÍͬ²½¡£µ«ÊÇʼþºÍÐźÅÁ¿¶¼ÎÞ·¨½â¾öÒÅÆúÎÊÌâ¡£

3¡¢ÁÙ½çÇøµÄЧÂÊÊÇ×î¸ßµÄ£¬ÒòΪËü²»ÊÇÄں˶ÔÏó¡£µ«ÊÇÁÙ½çÇø²»ÄÜ¿ç½ø³ÌʹÓá£

ʼþ£¬»¥³âÁ¿£¬ÐźÅÁ¿¶¼ÊÇÄں˶ÔÏ󣬿ÉÒÔ¿ç½ø³ÌʹÓ㬵«ÏàÓ¦µÄЧÂÊÒ²»áµÍºÜ¶à¡£

 

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

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
»ùÓÚFPGAµÄÒì¹¹¼ÆËãÔÚ¶àýÌåÖеÄÓ¦ÓÃ
ÉîÈëLinuxÄں˼ܹ¹¡ª¡ª¼ò½éÓë¸ÅÊö
LinuxÄÚºËϵͳ¼Ü¹¹½éÉÜ
dzÎöǶÈëʽCÓÅ»¯¼¼ÇÉ
½ø³Ì¼äͨÐÅ£¨IPC£©½éÉÜ
×îпγÌ
ǶÈëʽLinuxÇý¶¯¿ª·¢
´úÂëÕû½àÖ®µÀ-̬¶È¡¢¼¼ÒÕÓëϰ¹ß
ǶÈëʽÈí¼þ²âÊÔ
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
ǶÈëʽÈí¼þ¿É¿¿ÐÔÉè¼Æ
³É¹¦°¸Àý
ij¾ü¹¤Ëù ǶÈëʽÈí¼þ¼Ü¹¹
Öк½¹¤ÒµÄ³Ñо¿Ëù ǶÈëʽÈí¼þ¿ª·¢Ö¸ÄÏ
ij¹ìµÀ½»Í¨ ǶÈëʽÈí¼þ¸ß¼¶Éè¼ÆÊµ¼ù
ÉîÛÚ Ç¶ÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
ijÆóÒµ »ùÓÚIPDµÄǶÈëʽÈí¼þ¿ª·¢