多线程编程学习1

#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()
{
<span style="white-space:pre">	</span>printf("thread1:I'm thread 1\n");


<span style="white-space:pre">	</span>for(i=0;i<MAX;i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("thread1:number=%d\n",number);
<span style="white-space:pre">		</span>pthread_mutex_lock(&mut);
<span style="white-space:pre">			</span>number++;
<span style="white-space:pre">		</span>pthread_mutex_unlock(&mut);
<span style="white-space:pre">		</span>sleep(2);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>printf("thread1:主函数在等我完成任务吗?\n");
<span style="white-space:pre">	</span>pthread_exit(NULL);
}


void *thread2()
{
<span style="white-space:pre">	</span>printf("thread2: I'm thread 2\n");


<span style="white-space:pre">	</span>for(i=0;i<MAX;i++)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("thread2:number=%d\n",number);


<span style="white-space:pre">		</span>/**
<span style="white-space:pre">		</span>pthread_mutex_lock 声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁
<span style="white-space:pre">		</span>即同一时间只能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁被另一个线程使用,那
<span style="white-space:pre">		</span>此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。
<span style="white-space:pre">		</span>**/


<span style="white-space:pre">		</span>pthread_mutex_lock(&mut);
<span style="white-space:pre">			</span>number++;
<span style="white-space:pre">		</span>pthread_mutex_unlock(&mut);
<span style="white-space:pre">		</span>sleep(3);
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>printf("thread2:主函数在等我完成任务吗?\n");
<span style="white-space:pre">	</span>pthread_exit(NULL);
}


void thread_create(void)
{
<span style="white-space:pre">	</span>int temp;
<span style="white-space:pre">	</span>memset(&thread,0,sizeof(thread));   


<span style="white-space:pre">	</span>/**第一个参数为指向线程标志符的指针,类型为pthread_t *thread,
<span style="white-space:pre">	</span>   第二个参数用来设置线程属性,NULL生成默认属性的线程
<span style="white-space:pre">	</span>   第三个参数是线程运行函数的起始地址,void* (*start_routime)(void*)
<span style="white-space:pre">	</span>   最后一个参数是运行函数的参数 void *args
<span style="white-space:pre">	</span>   当创建线程成功时,函数返回0,若返回EAGAIN说明线程数目过多,若返回EINVAL,说明线程属性值非法
<span style="white-space:pre">	</span>**/
<span style="white-space:pre">	</span>if((temp=pthread_create(&thread[0],NULL,thread1,NULL))!=0)
<span style="white-space:pre">		</span>printf("线程1创建失败!\n");
<span style="white-space:pre">	</span>else
<span style="white-space:pre">		</span>printf("线程1被创建\n");


<span style="white-space:pre">	</span>if((temp=pthread_create(&thread[1],NULL,thread2,NULL))!=0)
<span style="white-space:pre">		</span>printf("线程2创建失败");
<span style="white-space:pre">	</span>else
<span style="white-space:pre">		</span>printf("线程2被创建");
}




void thread_wait(void)
{
<span style="white-space:pre">	</span>if(thread[0]!=0)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>/** extern int pthread_join(pthread_t thread,void **thread_return) 用来等待一个线程的结束
<span style="white-space:pre">		</span>第一个参数为被等待的线程标志符。
<span style="white-space:pre">		</span>第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值


<span style="white-space:pre">		</span>这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。
<span style="white-space:pre">		</span>一个线程的结束有两种途径,一种是函数结束,调用它的线程也就结束了,另一种是通过pthread_exit 来实现。


<span style="white-space:pre">		</span>**/
<span style="white-space:pre">		</span>pthread_join(thread[0],NULL);
<span style="white-space:pre">		</span>printf("线程1已经结束\n");
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>if(thread[1]!=0)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>pthread_join(thread[1],NULL);
<span style="white-space:pre">		</span>printf("线程2已经结束\n");
<span style="white-space:pre">	</span>}
}


int main()
{
<span style="white-space:pre">	</span>//函数pthread_mutex_init用来生成一个互斥锁。
<span style="white-space:pre">	</span>pthread_mutex_init(&mut,NULL);


<span style="white-space:pre">	</span>printf("我是主函数,我在创建线程\n");


<span style="white-space:pre">	</span>thread_create();


<span style="white-space:pre">	</span>printf("我是主函数,我在等待线程完成任务\n");
<span style="white-space:pre">	</span>thread_wait();
<span style="white-space:pre">	</span>return 0;
}










































你可能感兴趣的:(多线程编程学习1)