您的位置:首页 > 运维架构 > Linux

linux c编程 多线程(初级)

2015-08-18 23:37 609 查看
进程简单的说就是把一段代码复制成多份,并让他们同时执行。进程间通信是为了让他们有序的运行



线程简单的说就是让多个函数同时执行,线程间通信是为了让他们有序的运行



编译线程程序时会警告说线程函数找不到

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:创建两个线程,同时执行同一个函数

/* ex7-1.c */

#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:信号量控制线程运行顺序

/* thread_sem.c */

#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:互斥锁的使用

在这个程序中,一个线程要往缓冲区写数据,另一个线程要读数据,每次只能让一个线程操作缓冲区

/*ex7-3.c*/

#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
plaincopyprint?

/* ex7-4.c */

#include <stdio.h>

#include <pthread.h>

#define BUFFER_SIZE 4

#define OVER (-1)

struct producers

{

int buffer[BUFFER_SIZE];

pthread_mutex_t lock;

int readpos, writepos;

pthread_cond_t notempty;

pthread_cond_t notfull;

};



void init(struct producers *b)

{

pthread_mutex_init(&b->lock,NULL);

pthread_cond_init(&b->notempty,NULL);

pthread_cond_init(&b->notfull,NULL);

b->readpos=0;

b->writepos=0;

}



void put(struct producers *b, int data)

{

pthread_mutex_lock(&b->lock);

while((b->writepos+1)%BUFFER_SIZE==b->readpos)

{

pthread_cond_wait(&b->notfull,&b->lock);

}



b->buffer[b->writepos]=data;

b->writepos++;

if(b->writepos>=BUFFER_SIZE) b->writepos=0;

pthread_cond_signal(&b->notempty);

pthread_mutex_unlock(&b->lock);

}



int get(struct producers *b)

{

int data;

pthread_mutex_lock(&b->lock);

while(b->writepos==b->readpos)

{

pthread_cond_wait(&b->notempty,&b->lock);

}

data=b->buffer[b->readpos];

b->readpos++;

if(b->readpos>=BUFFER_SIZE) b->readpos=0;

pthread_cond_signal(&b->notfull);

pthread_mutex_unlock(&b->lock);

return data;

}



struct producers buffer;

void *producer(void *data)

{

int n;

for(n=0;n<10;n++)

{

printf("Producer : %d-->\n",n);

put(&buffer,n);

}

put(&buffer,OVER);

return NULL;

}



void *consumer(void *data)

{

int d;

while(1)

{

d=get(&buffer);

if(d==OVER) break;

printf("Consumer: --> %d\n",d);

}

return NULL;

}



int main()

{

pthread_t tha,thb;

void *retval;

init(&buffer);

pthread_create(&tha,NULL,producer,0);

pthread_create(&thb,NULL,consumer,0);

pthread_join(tha,&retval);

pthread_join(thb,&retval);

return 0;



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: