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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
c++¶àÏ̱߳à³Ì
 
×÷Õߣºhitwengqi À´Ô´£ºCSDN ·¢²¼ÓÚ£º2015-6-18
  3020  次浏览      28
 

Ò»Ö±¶Ô¶àÏ̱߳à³ÌÕâÒ»¿éºÜİÉú£¬¾ö¶¨»¨Ò»µãʱ¼äÕûÀíһϡ£

os:ubuntu 10.04 c++

1.×î»ù´¡£¬½ø³Ìͬʱ´´½¨5¸öỊ̈߳¬¸÷×Ôµ÷ÓÃͬһ¸öº¯Êý

#include   
#include  //¶àÏß³ÌÏà¹Ø²Ù×÷Í·Îļþ£¬¿ÉÒÆÖ²ÖÚ¶àÆ½Ì¨  
  
using namespace std;  
  
#define NUM_THREADS 5 //Ïß³ÌÊý  
  
void* say_hello( void* args )  
{  
    cout << "hello..." << endl;  
} //º¯Êý·µ»ØµÄÊǺ¯ÊýÖ¸Õ룬±ãÓÚºóÃæ×÷Ϊ²ÎÊý  
  
int main()  
{  
    pthread_t tids[NUM_THREADS]; //Ïß³Ìid  
    for( int i = 0; i < NUM_THREADS; ++i )  
    {  
        int ret = pthread_create( &tids[i], NULL, say_hello, NULL ); 
//²ÎÊý£º´´½¨µÄÏß³Ìid£¬Ï̲߳ÎÊý£¬Ïß³ÌÔËÐк¯ÊýµÄÆðʼµØÖ·£¬ÔËÐк¯ÊýµÄ²ÎÊý  
        if( ret != 0 ) //´´½¨Ï̳߳ɹ¦·µ»Ø0  
        {  
            cout << "pthread_create error:error_code=" << ret << endl;  
        }  
    }  
    pthread_exit( NULL ); //µÈ´ý¸÷¸öÏß³ÌÍ˳öºó£¬½ø³Ì²Å½áÊø£¬·ñÔò½ø³ÌÇ¿ÖÆ½áÊø£¬Ï̴߳¦ÓÚδÖÕÖ¹µÄ״̬  
}  

ÊäÈëÃüÁg++ -o muti_thread_test_1 muti_thread_test_1.cpp -lpthread

×¢Ò⣺

1£©´ËΪc++³ÌÐò£¬¹ÊÓÃg++À´±àÒëÉú³É¿ÉÖ´ÐÐÎļþ£¬²¢ÇÒÒªµ÷Óô¦Àí¶àÏ̲߳Ù×÷Ïà¹ØµÄ¾²Ì¬Á´½Ó¿âÎļþpthread¡£

2£©-lpthread ±àÒëÑ¡ÏλÖÿÉÈÎÒ⣬Èçg++ -lpthread -o muti_thread_test_1 muti_thread_test_1.cpp

3£©×¢ÒâgccºÍg++µÄÇø±ð£¬×ªµ½´ËÎÄ£ºµã»÷´ò¿ªÁ´½Ó

²âÊÔ½á¹û£º

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_1  
hello...hello...
hello...
hello...

hello...

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_1  
hello...hello...hello...

hello...
hello...

¿ÉÖª£¬Á½´ÎÔËÐеĽá¹û»áÓвî±ð£¬Õâ²»ÊǶàÏ̵߳ÄÌØµã°É£¿ÕâÏÔȻûÓÐͬ²½£¿»¹Óдý½øÒ»²½Ì½Ë÷...

¶àÏ̵߳ÄÔËÐÐÊÇ»ìÂҵ쬻ìÂÒ¾ÍÊÇÕý³££¿

2.Ï̵߳÷Óõ½º¯ÊýÔÚÒ»¸öÀàÖУ¬ÄDZØÐ뽫¸Ãº¯ÊýÉùÃ÷Ϊ¾²Ì¬º¯Êýº¯Êý

ÒòΪ¾²Ì¬³ÉÔ±º¯ÊýÊôÓÚ¾²Ì¬È«¾ÖÇø£¬Ï߳̿ÉÒÔ¹²ÏíÕâ¸öÇøÓò£¬¹Ê¿ÉÒÔ¸÷×Ôµ÷Óá£

#include <iostream>  
#include <pthread.h>

using namespace std;

#define NUM_THREADS 5

class Hello
{
public:
static void* say_hello( void* args )
{
cout << "hello..." << endl;
}
};

int main()
{
pthread_t tids[NUM_THREADS];
for( int i = 0; i < NUM_THREADS; ++i )
{
int ret = pthread_create( &tids[i], NULL, Hello::say_hello, NULL );
if( ret != 0 )
{
cout << "pthread_create error:error_code" << ret << endl;
}
}
pthread_exit( NULL );
}

²âÊÔ½á¹û£º

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_2  
hello...
hello...
hello...
hello...
hello...

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_2  
hello...hello...hello...


hello...
hello...

3.ÈçºÎÔÚÏ̵߳÷Óú¯Êýʱ´«Èë²ÎÊýÄØ£¿

ÏÈ¿´ÏÂÃæÐ޸ĵĴúÂ룬´«ÈëÏ̱߳àºÅ×÷Ϊ²ÎÊý£º

#include <iostream>  
#include <pthread.h> //¶àÏß³ÌÏà¹Ø²Ù×÷Í·Îļþ£¬¿ÉÒÆÖ²ÖÚ¶àÆ½Ì¨

using namespace std;

#define NUM_THREADS 5 //Ïß³ÌÊý

void* say_hello( void* args )
{
int i = *( (int*)args ); //¶Ô´«ÈëµÄ²ÎÊý½øÐÐÇ¿ÖÆÀàÐÍת»»£¬ ÓÉÎÞÀàÐÍÖ¸Õëת±äΪÕûÐÎÖ¸Õ룬ÔÙÓÃ*¶ÁÈ¡ÆäÖ¸Ïòµ½ÄÚÈÝ
cout << "hello in " << i << endl;
} //º¯Êý·µ»ØµÄÊǺ¯ÊýÖ¸Õ룬±ãÓÚºóÃæ×÷Ϊ²ÎÊý

int main()
{
pthread_t tids[NUM_THREADS]; //Ïß³Ìid
cout << "hello in main.." << endl;
for( int i = 0; i < NUM_THREADS; ++i )
{
int ret = pthread_create( &tids[i], NULL, say_hello, (void*)&i ); //´«Èëµ½²ÎÊý±ØÐëǿתΪvoid*ÀàÐÍ£¬¼´ÎÞÀàÐÍÖ¸Õ룬&i±íʾȡiµÄµØÖ·£¬¼´Ö¸ÏòiµÄÖ¸Õë
cout << "Current pthread id = " << tids[i] << endl; //ÓÃtidsÊý×é´òÓ¡´´½¨µÄ½ø³ÌidÐÅÏ¢
if( ret != 0 ) //´´½¨Ï̳߳ɹ¦·µ»Ø0
{
cout << "pthread_create error:error_code=" << ret << endl;
}
}
pthread_exit( NULL ); //µÈ´ý¸÷¸öÏß³ÌÍ˳öºó£¬ ½ø³Ì²Å½áÊø£¬·ñÔò½ø³ÌÇ¿ÖÆ½áÊø£¬Ï̴߳¦ÓÚδÖÕÖ¹µÄ״̬
}

²âÊÔ½á¹û£º

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_3  
hello in main..
Current pthread id = 3078458224
Current pthread id = 3070065520
hello in hello in 2
1
Current pthread id = hello in 2
3061672816
Current pthread id = 3053280112
hello in 4
Current pthread id = hello in 4
3044887408

ÏÔÈ»²»ÊÇÏëÒªµÄ½á¹û£¬µ÷ÓÃ˳ÐòºÜÂÒ£¬ÕâÊÇÎªÊ²Ã´ÄØ£¿

ÕâÊÇÒòΪ¶àÏ̵߳½Ôµ¹Ê£¬Ö÷½ø³Ì»¹Ã»¿ªÊ¼¶Ôi¸³Öµ£¬Ïß³ÌÒѾ­¿ªÊ¼ÅÜÁË...?

Ð޸ĴúÂëÈçÏ£º

#include <iostream>  
#include <pthread.h> //¶àÏß³ÌÏà¹Ø²Ù×÷Í·Îļþ£¬¿ÉÒÆÖ²ÖÚ¶àÆ½Ì¨

using namespace std;

#define NUM_THREADS 5 //Ïß³ÌÊý

void* say_hello( void* args )
{
cout << "hello in thread " << *( (int *)args ) << endl;
} //º¯Êý·µ»ØµÄÊǺ¯ÊýÖ¸Õ룬±ãÓÚºóÃæ×÷Ϊ²ÎÊý

int main()
{
pthread_t tids[NUM_THREADS]; //Ïß³Ìid
int indexes[NUM_THREADS]; //ÓÃÀ´±£´æiµÄÖµ±ÜÃâ±»ÐÞ¸Ä

for( int i = 0; i < NUM_THREADS; ++i )
{
indexes[i] = i;
int ret = pthread_create( &tids[i], NULL, say_hello, (void*)&(indexes[i]) );
if( ret != 0 ) //´´½¨Ï̳߳ɹ¦·µ»Ø0
{
cout << "pthread_create error:error_code=" << ret << endl;
}
}
for( int i = 0; i < NUM_THREADS; ++i )
pthread_join( tids[i], NULL ); //pthread_joinÓÃÀ´µÈ´ýÒ»¸öÏ̵߳ĽáÊø£¬ÊÇÒ»¸öÏß³Ì×èÈûµÄº¯Êý
}

²âÊÔ½á¹û£º

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_3  
hello in thread hello in thread hello in thread hello in thread hello in thread 30124

ÕâÊÇÕý³£µÄÂ𣿸оõ»¹ÊÇÓÐÎÊÌâ...´ýÐø

´úÂëÖÐÈç¹ûûÓÐpthread_joinÖ÷Ï̻߳áºÜ¿ì½áÊø´Ó¶øÊ¹Õû¸ö½ø³Ì½áÊø£¬´Ó¶øÊ¹´´½¨µÄÏß³ÌûÓлú»á¿ªÊ¼Ö´ÐоͽáÊøÁË¡£¼ÓÈëpthread_joinºó£¬Ö÷Ï̻߳áÒ»Ö±µÈ´ýÖ±µ½µÈ´ýµÄÏ߳̽áÊø×Ô¼º²Å½áÊø£¬Ê¹´´½¨µÄÏß³ÌÓлú»áÖ´ÐС£

4.Ï̴߳´½¨Ê±ÊôÐÔ²ÎÊýµÄÉèÖÃpthread_attr_t¼°join¹¦ÄܵÄʹÓÃ

Ï̵߳ÄÊôÐÔÓɽṹÌåpthread_attr_t½øÐйÜÀí¡£

typedef struct
{
int detachstate; Ï̵߳ķÖÀë״̬
int schedpolicy; Ï̵߳÷¶È²ßÂÔ
struct sched_param schedparam; Ï̵߳ĵ÷¶È²ÎÊý
int inheritsched; Ï̵߳ļ̳ÐÐÔ
int scope; Ï̵߳Ä×÷ÓÃÓò
size_t guardsize; Ïß³ÌջĩβµÄ¾¯½ä»º³åÇø´óС
int stackaddr_set; void * stackaddr; Ïß³ÌÕ»µÄλÖÃ
size_t stacksize; Ïß³ÌÕ»µÄ´óС
}pthread_attr_t;

#include <iostream>  
#include <pthread.h>

using namespace std;

#define NUM_THREADS 5

void* say_hello( void* args )
{
cout << "hello in thread " << *(( int * )args) << endl;
int status = 10 + *(( int * )args); //Ïß³ÌÍ˳öʱÌí¼ÓÍ˳öµÄÐÅÏ¢£¬status¹©Ö÷³ÌÐòÌáÈ¡¸ÃÏ̵߳ĽáÊøÐÅÏ¢
pthread_exit( ( void* )status );
}

int main()
{
pthread_t tids[NUM_THREADS];
int indexes[NUM_THREADS];

pthread_attr_t attr; //Ïß³ÌÊôÐԽṹÌ壬´´½¨Ïß³Ìʱ¼ÓÈëµÄ²ÎÊý
pthread_attr_init( &attr ); //³õʼ»¯
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); //ÊÇÉèÖÃÄãÏëÒªÖ¸¶¨Ïß³ÌÊôÐÔ²ÎÊý£¬Õâ¸ö²ÎÊý±íÃ÷Õâ¸öÏß³ÌÊÇ¿ÉÒÔjoinÁ¬½ÓµÄ£¬ join¹¦ÄܱíʾÖ÷³ÌÐò¿ÉÒÔµÈÏ߳̽áÊøºóÔÙÈ¥×öijÊ£¬ÊµÏÖÁËÖ÷³ÌÐòºÍÏß³Ìͬ²½¹¦ÄÜ
for( int i = 0; i < NUM_THREADS; ++i )
{
indexes[i] = i;
int ret = pthread_create( &tids[i], &attr, say_hello, ( void* )&( indexes[i] ) );
if( ret != 0 )
{
cout << "pthread_create error:error_code=" << ret << endl;
}
}
pthread_attr_destroy( &attr ); //ÊÍ·ÅÄÚ´æ
void *status;
for( int i = 0; i < NUM_THREADS; ++i )
{
int ret = pthread_join( tids[i], &status ); //Ö÷³ÌÐòjoinÿ¸öÏ̺߳óÈ¡µÃÿ¸öÏ̵߳ÄÍ˳öÐÅÏ¢status
if( ret != 0 )
{
cout << "pthread_join error:error_code=" << ret << endl;
}
else
{
cout << "pthread_join get status:" << (long)status << endl;
}
}
}

²âÊÔ½á¹û£º

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_4  
hello in thread hello in thread hello in thread hello in thread 0hello in thread 321



4
pthread_join get status:10
pthread_join get status:11
pthread_join get status:12
pthread_join get status:13
pthread_join get status:14

5.»¥³âËøµÄʵÏÖ

»¥³âËøÊÇʵÏÖÏß³Ìͬ²½µÄÒ»ÖÖ»úÖÆ£¬Ö»ÒªÔÚÁÙ½çÇøÇ°ºó¶Ô×ÊÔ´¼ÓËø¾ÍÄÜ×èÈûÆäËû½ø³ÌµÄ·ÃÎÊ¡£

#include <iostream>  
#include <pthread.h>

using namespace std;

#define NUM_THREADS 5

int sum = 0; //¶¨ÒåÈ«¾Ö±äÁ¿£¬ÈÃËùÓÐÏß³Ìͬʱд£¬ÕâÑù¾ÍÐèÒªËø»úÖÆ
pthread_mutex_t sum_mutex; //»¥³âËø

void* say_hello( void* args )
{
cout << "hello in thread " << *(( int * )args) << endl;
pthread_mutex_lock( &sum_mutex ); //ÏȼÓËø£¬ÔÙÐÞ¸ÄsumµÄÖµ£¬Ëø±»Õ¼ÓþÍ×èÈû£¬Ö±µ½Äõ½ËøÔÙÐÞ¸Äsum;
cout << "before sum is " << sum << " in thread " << *( ( int* )args ) << endl;
sum += *( ( int* )args );
cout << "after sum is " << sum << " in thread " << *( ( int* )args ) << endl;
pthread_mutex_unlock( &sum_mutex ); //ÊÍ·ÅËø£¬¹©ÆäËûÏß³ÌʹÓÃ
pthread_exit( 0 );
}

int main()
{
pthread_t tids[NUM_THREADS];
int indexes[NUM_THREADS];

pthread_attr_t attr; //Ïß³ÌÊôÐԽṹÌ壬´´½¨Ïß³Ìʱ¼ÓÈëµÄ²ÎÊý
pthread_attr_init( &attr ); //³õʼ»¯
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); //ÊÇÉèÖÃÄãÏëÒªÖ¸¶¨Ïß³ÌÊôÐÔ²ÎÊý£¬Õâ¸ö²ÎÊý±íÃ÷Õâ¸öÏß³ÌÊÇ¿ÉÒÔjoinÁ¬½ÓµÄ£¬ join¹¦ÄܱíʾÖ÷³ÌÐò¿ÉÒÔµÈÏ߳̽áÊøºóÔÙÈ¥×öijÊ£¬ÊµÏÖÁËÖ÷³ÌÐòºÍÏß³Ìͬ²½¹¦ÄÜ
pthread_mutex_init( &sum_mutex, NULL ); //¶ÔËø½øÐгõʼ»¯

for( int i = 0; i < NUM_THREADS; ++i )
{
indexes[i] = i;
int ret = pthread_create( &tids[i], &attr, say_hello, ( void* )&( indexes[i] ) ); //5¸ö½ø³ÌͬʱȥÐÞ¸Äsum
if( ret != 0 )
{
cout << "pthread_create error:error_code=" << ret << endl;
}
}
pthread_attr_destroy( &attr ); //ÊÍ·ÅÄÚ´æ
void *status;
for( int i = 0; i < NUM_THREADS; ++i )
{
int ret = pthread_join( tids[i], &status ); //Ö÷³ÌÐòjoinÿ¸öÏ̺߳óÈ¡µÃÿ¸öÏ̵߳ÄÍ˳öÐÅÏ¢status
if( ret != 0 )
{
cout << "pthread_join error:error_code=" << ret << endl;
}
}
cout << "finally sum is " << sum << endl;
pthread_mutex_destroy( &sum_mutex ); //×¢ÏúËø
}

²âÊÔ½á¹û£º

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_5  
hello in thread hello in thread hello in thread 410
before sum is hello in thread 0 in thread 4
after sum is 4 in thread 4hello in thread


2
3
before sum is 4 in thread 1
after sum is 5 in thread 1
before sum is 5 in thread 0
after sum is 5 in thread 0
before sum is 5 in thread 2
after sum is 7 in thread 2
before sum is 7 in thread 3
after sum is 10 in thread 3
finally sum is 10

¿ÉÖª£¬sumµÄ·ÃÎʺÍÐÞ¸Ä˳ÐòÊÇÕý³£µÄ£¬Õâ¾Í´ïµ½Á˶àÏ̵߳ÄÄ¿µÄÁË£¬µ«ÊÇÏ̵߳ÄÔËÐÐ˳ÐòÊÇ»ìÂҵ쬻ìÂÒ¾ÍÊÇÕý³££¿

6.ÐźÅÁ¿µÄʵÏÖ

ÐźÅÁ¿ÊÇÏß³Ìͬ²½µÄÁíÒ»ÖÖʵÏÖ»úÖÆ£¬ÐźÅÁ¿µÄ²Ù×÷ÓÐsignalºÍwait£¬±¾Àý×Ó²ÉÓÃÌõ¼þÐźűäÁ¿pthread_cond_t tasks_cond;

ÐźÅÁ¿µÄʵÏÖÒ²Òª¸øÓèËø»úÖÆ¡£

#include <iostream>  
#include <pthread.h>
#include <stdio.h>

using namespace std;

#define BOUNDARY 5

int tasks = 10;
pthread_mutex_t tasks_mutex; //»¥³âËø
pthread_cond_t tasks_cond; //Ìõ¼þÐźűäÁ¿£¬´¦ÀíÁ½¸öÏ̼߳äµÄÌõ¼þ¹ØÏµ£¬µ±task>5£¬hello2´¦Àí£¬·´Ö®hello1´¦Àí£¬Ö±µ½task¼õΪ0

void* say_hello2( void* args )
{
pthread_t pid = pthread_self(); //»ñÈ¡µ±Ç°Ïß³Ìid
cout << "[" << pid << "] hello in thread " << *( ( int* )args ) << endl;

bool is_signaled = false; //sign
while(1)
{
pthread_mutex_lock( &tasks_mutex ); //¼ÓËø
if( tasks > BOUNDARY )
{
cout << "[" << pid << "] take task: " << tasks << " in thread " << *( (int*)args ) << endl;
--tasks; //modify
}
else if( !is_signaled )
{
cout << "[" << pid << "] pthread_cond_signal in thread " << *( ( int* )args ) << endl;
pthread_cond_signal( &tasks_cond ); //signal:Ïòhello1·¢ËÍÐźţ¬±íÃ÷ÒѾ­>5
is_signaled = true; //±íÃ÷ÐźÅÒÑ·¢ËÍ£¬Í˳ö´ËÏß³Ì
}
pthread_mutex_unlock( &tasks_mutex ); //½âËø
if( tasks == 0 )
break;
}
}

void* say_hello1( void* args )
{
pthread_t pid = pthread_self(); //»ñÈ¡µ±Ç°Ïß³Ìid
cout << "[" << pid << "] hello in thread " << *( ( int* )args ) << endl;

while(1)
{
pthread_mutex_lock( &tasks_mutex ); //¼ÓËø
if( tasks > BOUNDARY )
{
cout << "[" << pid << "] pthread_cond_signal in thread " << *( ( int* )args ) << endl;
pthread_cond_wait( &tasks_cond, &tasks_mutex ); //wait:µÈ´ýÐźÅÁ¿ÉúЧ£¬½ÓÊÕµ½Ðźţ¬Ïòhello2·¢³öÐźţ¬Ìø³öwait,Ö´ÐкóÐø
}
else
{
cout << "[" << pid << "] take task: " << tasks << " in thread " << *( (int*)args ) << endl;
--tasks;
}
pthread_mutex_unlock( &tasks_mutex ); //½âËø
if( tasks == 0 )
break;
}
}


int main()
{
pthread_attr_t attr; //Ïß³ÌÊôÐԽṹÌ壬´´½¨Ïß³Ìʱ¼ÓÈëµÄ²ÎÊý
pthread_attr_init( &attr ); //³õʼ»¯
pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); //ÊÇÉèÖÃÄãÏëÒªÖ¸¶¨Ïß³ÌÊôÐÔ²ÎÊý£¬Õâ¸ö²ÎÊý±íÃ÷Õâ¸öÏß³ÌÊÇ¿ÉÒÔjoinÁ¬½ÓµÄ£¬ join¹¦ÄܱíʾÖ÷³ÌÐò¿ÉÒÔµÈÏ߳̽áÊøºóÔÙÈ¥×öijÊ£¬ÊµÏÖÁËÖ÷³ÌÐòºÍÏß³Ìͬ²½¹¦ÄÜ
pthread_cond_init( &tasks_cond, NULL ); //³õʼ»¯Ìõ¼þÐźÅÁ¿
pthread_mutex_init( &tasks_mutex, NULL ); //³õʼ»¯»¥³âÁ¿
pthread_t tid1, tid2; //±£´æÁ½¸öÏß³Ìid
int index1 = 1;
int ret = pthread_create( &tid1, &attr, say_hello1, ( void* )&index1 );
if( ret != 0 )
{
cout << "pthread_create error:error_code=" << ret << endl;
}
int index2 = 2;
ret = pthread_create( &tid2, &attr, say_hello2, ( void* )&index2 );
if( ret != 0 )
{
cout << "pthread_create error:error_code=" << ret << endl;
}
pthread_join( tid1, NULL ); //Á¬½ÓÁ½¸öÏß³Ì
pthread_join( tid2, NULL );

pthread_attr_destroy( &attr ); //ÊÍ·ÅÄÚ´æ
pthread_mutex_destroy( &tasks_mutex ); //×¢ÏúËø
pthread_cond_destroy( &tasks_cond ); //Õý³£Í˳ö
}

²âÊÔ½á¹û£º

ÏÈÔÚÏß³Ì2ÖÐÖ´ÐÐsay_hello2£¬ÔÙÌø×ªµ½Ïß³Ì1ÖÐÖ´ÐÐsay_hello1£¬Ö±µ½tasks¼õµ½0Ϊֹ¡£

wq@wq-desktop:~/coding/muti_thread$ ./muti_thread_test_6  
[3069823856] hello in thread 2
[3078216560] hello in thread 1[3069823856] take task: 10 in thread 2

[3069823856] take task: 9 in thread 2
[3069823856] take task: 8 in thread 2
[3069823856] take task: 7 in thread 2
[3069823856] take task: 6 in thread 2
[3069823856] pthread_cond_signal in thread 2
[3078216560] take task: 5 in thread 1
[3078216560] take task: 4 in thread 1
[3078216560] take task: 3 in thread 1
[3078216560] take task: 2 in thread 1
[3078216560] take task: 1 in thread 1

µ½´Ë£¬¶Ô¶àÏ̱߳à³ÌÓÐÁËÒ»¸ö³õ²½µÄÁ˽⣬µ±È»»¹ÓÐÆäËûʵÏÖÏß³Ìͬ²½µÄ»úÖÆ£¬Óдý½øÒ»²½Ì½Ë÷¡£

   
3020 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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

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

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ