天天看點

(轉)linux c多線程程式設計

來源于: http://blog.csdn.net/liang890319/article/details/8393120

pthread 庫不是 Linux 系統預設的庫,連接配接時需要使用靜态庫 libpthread.a,是以在使用pthread_create()建立線程,以及調用 pthread_atfork()函數建立fork處理程式時,需要連結該庫。

問題解決:

    在編譯中要加 -lpthread參數

    gcc thread.c -o thread -lpthread

    thread.c為你些的源檔案,不要忘了加上頭檔案#include<pthread.h>

http://blog.csdn.net/llqkk/article/details/2854558

執行個體1:建立兩個線程,同時執行同一個函數

#include <stddef.h>

#include <stdio.h>

#include <unistd.h>

#include <pthread.h>

#include <string.h>

void print_msg(char *ptr);

int main()

{

pthread_t thread1, thread2;

int i,j;

char *msg1="do sth1\n";

char *msg2="do sth2\n";

pthread_create(&thread1,NULL, (void *)(&print_msg), (void *)msg1);

pthread_create(&thread2,NULL, (void *)(&print_msg), (void *)msg2);

sleep(1);

return 0;

}

void  print_msg(char *ptr)

{

int retval;

int id=pthread_self();

printf("Thread ID: %x\n",id);

  printf("%s",ptr);

pthread_exit(&retval);

}

執行gcc ex7-1.c -lpthread

./a.out

執行個體2  建立多個線程執行不同函數

代碼來自 http://www.cnblogs.com/BiffoLee/archive/2011/11/18/2254540.html

#include <pthread.h>

#include <stdio.h>

#include <sys/time.h>

#include <string.h>

#define MAX 10

pthread_t thread[2];

pthread_mutex_t mut;

int number=0, i;

void *thread1()

{

    printf ("thread1 : I'm thread 1\n");

    for (i = 0; i < MAX; i++)

        {

            printf("thread1 : number = %d\n",number);

            pthread_mutex_lock(&mut);

            number++;

            pthread_mutex_unlock(&mut);

            sleep(2);

        }

    printf("thread1 :主函數在等我完成任務嗎?\n");

    pthread_exit(NULL);

}

void *thread2()

{

    printf("thread2 : I'm thread 2\n");

    for (i = 0; i < MAX; i++)

        {

            printf("thread2 : number = %d\n",number);

            pthread_mutex_lock(&mut);

            number++;

            pthread_mutex_unlock(&mut);

            sleep(3);

        }

    printf("thread2 :主函數在等我完成任務嗎?\n");

    pthread_exit(NULL);

}

void thread_create(void)

{

    int temp;

    memset(&thread, 0, sizeof(thread)); //comment1

    //建立線程

    if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2

        printf("線程1建立失敗!\n");

    else

        printf("線程1被建立\n");

    if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3

        printf("線程2建立失敗");

    else

        printf("線程2被建立\n");

}

void thread_wait(void)

{

    //等待線程結束

    if(thread[0] !=0) { //comment4

        pthread_join(thread[0],NULL);

        printf("線程1已經結束\n");

    }

    if(thread[1] !=0) { //comment5

        pthread_join(thread[1],NULL);

        printf("線程2已經結束\n");

    }

}

int main()

{

    //用預設屬性初始化互斥鎖

    pthread_mutex_init(&mut,NULL);

    printf("我是主函數哦,我正在建立線程,呵呵\n");

    thread_create();

    printf("我是主函數哦,我正在等待線程完成任務阿,呵呵\n");

    thread_wait();

    return 0;

}

?

編譯 :

       gcc -lpthread -o thread_example lp.c

執行個體3:信号量控制線程運作順序

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#include <semaphore.h>

#define THREAD_NUMBER 3

#define REPEAT_NUMBER 3

#define DELAY_TIME_LEVELS 10.0

sem_t sem[THREAD_NUMBER];

void * thrd_func(void *arg)

{

int thrd_num = (int)arg;

int delay_time = 0;

int count = 0;

sem_wait(&sem[thrd_num]);

printf("Thread %d is starting\n", thrd_num);

for (count = 0; count < REPEAT_NUMBER; count++)

{

delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX)) + 1;

sleep(delay_time);

printf("\tThread %d: job %d delay = %d\n", thrd_num, count, delay_time);

}

printf("Thread %d finished\n", thrd_num);

pthread_exit(NULL);

}

int main(void)

{

pthread_t thread[THREAD_NUMBER];

int no = 0, res;

void * thrd_ret;

srand(time(NULL));

for (no = 0; no < THREAD_NUMBER; no++)

{

sem_init(&sem[no], 0, 0);

res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);

if (res != 0)

{

printf("Create thread %d failed\n", no);

exit(res);

}

}

printf("Create treads success\n Waiting for threads to finish...\n");

sem_post(&sem[THREAD_NUMBER - 1]);

for (no = THREAD_NUMBER - 1; no >= 0; no--)

{

res = pthread_join(thread[no], &thrd_ret);

if (!res)

{

printf("Thread %d joined\n", no);

}

else

{

printf("Thread %d join failed\n", no);

}

sem_post(&sem[(no + THREAD_NUMBER - 1) % THREAD_NUMBER]);

}

for (no = 0; no < THREAD_NUMBER; no++)

{

sem_destroy(&sem[no]);

}

return 0;        

}

執行個體4:互斥鎖的使用

在這個程式中,一個線程要往緩沖區寫資料,另一個線程要讀資料,每次隻能讓一個線程操作緩沖區

#include <stddef.h>

#include <stdio.h>

#include <unistd.h>

#include <pthread.h>

#define FALSE 0

#define TRUE 1

void readfun();

void writefun();

char buffer[256];

int buffer_has_item=0;

int retflag=FALSE,i=0;

pthread_mutex_t mutex;

int main()

{

void *retval;

pthread_t reader;

pthread_mutex_init(&mutex,NULL);

pthread_create(&reader,NULL,(void *)&readfun,NULL);

writefun();

pthread_join(reader,&retval);

}

void readfun()

{

while(1)

{

if(retflag)

return;

pthread_mutex_lock(&mutex);

if(buffer_has_item==1)

{

printf("%s",buffer);

buffer_has_item=0;

}

pthread_mutex_unlock(&mutex);

}

}

void writefun()

{

int i=0;

while(1)

{

if(i==10)

{

retflag=TRUE;

return;

}

pthread_mutex_lock(&mutex);

if(buffer_has_item==0)

{

sprintf(buffer,"This is %d\n",i++);

buffer_has_item=1;

}

pthread_mutex_unlock(&mutex);

}

}

執行個體5 條件變量

text

[cpp]  view plain copy print ?

  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. #define BUFFER_SIZE 4  
  4. #define OVER (-1)  
  5. struct producers  
  6. {  
  7.     int buffer[BUFFER_SIZE];  
  8.     pthread_mutex_t lock;  
  9.     int     readpos, writepos;  
  10.     pthread_cond_t  notempty;  
  11.     pthread_cond_t  notfull;  
  12. };  
  13. void init(struct producers *b)  
  14. {  
  15.     pthread_mutex_init(&b->lock,NULL);  
  16.     pthread_cond_init(&b->notempty,NULL);  
  17.     pthread_cond_init(&b->notfull,NULL);  
  18.     b->readpos=0;  
  19.     b->writepos=0;  
  20. }  
  21. void put(struct producers *b, int data)  
  22. {  
  23.     pthread_mutex_lock(&b->lock);  
  24.     while((b->writepos+1)%BUFFER_SIZE==b->readpos)  
  25.     {  
  26.         pthread_cond_wait(&b->notfull,&b->lock);  
  27.     }  
  28.     b->buffer[b->writepos]=data;  
  29.     b->writepos++;  
  30.     if(b->writepos>=BUFFER_SIZE) b->writepos=0;  
  31.     pthread_cond_signal(&b->notempty);  
  32.     pthread_mutex_unlock(&b->lock);  
  33. }  
  34. int get(struct producers *b)  
  35. {  
  36.     int data;  
  37.     pthread_mutex_lock(&b->lock);  
  38.     while(b->writepos==b->readpos)  
  39.     {  
  40.         pthread_cond_wait(&b->notempty,&b->lock);  
  41.     }  
  42.     data=b->buffer[b->readpos];  
  43.     b->readpos++;  
  44.     if(b->readpos>=BUFFER_SIZE) b->readpos=0;  
  45.     pthread_cond_signal(&b->notfull);  
  46.     pthread_mutex_unlock(&b->lock);  
  47.     return data;  
  48. }  
  49. struct producers  buffer;  
  50. void *producer(void *data)  
  51. {  
  52.     int n;  
  53.     for(n=0;n<10;n++)  
  54.     {  
  55.         printf("Producer : %d-->\n",n);  
  56.         put(&buffer,n);  
  57.     }  
  58.     put(&buffer,OVER);  
  59.     return NULL;  
  60. }  
  61. void *consumer(void *data)  
  62. {  
  63.     int d;  
  64.     while(1)  
  65.     {  
  66.         d=get(&buffer);  
  67.         if(d==OVER) break;  
  68.         printf("Consumer: --> %d\n",d);  
  69.     }  
  70.     return NULL;  
  71. }  
  72. int main()  
  73. {  
  74.     pthread_t tha,thb;  
  75.     void *retval;  
  76.     init(&buffer);  
  77.     pthread_create(&tha,NULL,producer,0);  
  78.     pthread_create(&thb,NULL,consumer,0);  
  79.     pthread_join(tha,&retval);  
  80.     pthread_join(thb,&retval);  
  81.     return 0;  
  82. }  

繼續閱讀