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

Linux下多线程基础编程实例(1)

2013-05-28 09:32 134 查看
实例是在网上看到的,大意如下:

有一个全局变量flag, 在main()函数中创建两个线程,去改变这个全局变量的值,要使得线程2等待线程1退出后再退出;当flag 的值从2变为1的时候,主函数再退出;

其实这个例子不太难,了解一些线程相关的函数。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void *task1(void *);//线程1执行函数
void *task2(void *);

void create_thread();//创建线程函数,把创建的过程都放在函数里
int p1,p2;
int flag = 0;//全局变量
pthread_t pid1,pid2; //线程pid
pthread_cond_t cond; //线程等待条件
pthread_mutex_t mutex;//线程的互斥信号量

int main()
{
printf("begin main \n");
usr();//创建两个线程
struct timespec tv;	//设置等待超时时间

tv.tv_sec = time(0) + 5;
tv.tv_nsec = 0;
pthread_cond_timedwait(&cond,&mutex,&tv);//等待条件满足或者等待时间超时
printf("end main...\n");
return 0;
}

int usr()
{

pthread_attr_t attr;//
void *p ;
int ret = 0;
pthread_attr_init(&attr);
//	pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//设置为分离的属性
//分离线程,线程执行完退出后,所有资源都要释放,非分离线程,线程必须保留它的线程ID,退出状态直到其他线程调用了pthread_join
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);//设置线程属性,默认就是非分离的
pthread_create(&pid1, &attr, task1, NULL);
//	pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
pthread_create(&pid2, &attr, task2, NULL);
return 1;
}

void *task1(void *arg1)
{
int i = 0;
printf("begin task1........ \n");

pthread_mutex_lock(&mutex);
printf("this is thread 1  pid  = %d ,flag = %d\n",(unsigned int )pthread_self(),flag);
if(flag == 2)
pthread_cond_signal(&cond);
flag = 1;
printf("in thread 1 flag change = %d \n",flag);
pthread_mutex_unlock(&mutex);
for(i = 0;i<1000;i++)
;
printf("end task 1....");
pthread_exit((void *)1);
}

void *task2(void *arg2)
{
int i = 0;
pthread_join(pid1,NULL);//等待线程1结束

printf("begin task 2 ........\n");

pthread_mutex_lock(&mutex);
printf("this is thread 2  pid  = %d ,flag = %d\n",(unsigned int)pthread_self(),flag);
if(flag == 1)
pthread_cond_signal(&cond);
flag = 2;

printf("in thread 2 flag change = %d \n",flag);
pthread_mutex_unlock(&mutex);
printf("end task2.......\n");
pthread_exit((void *)2);
}


实验运行结果如下:

其中pid打印的是负数,不符常理,所以可以以无符号的格式输出;

printf("pid = %u \n",pthread_self());就能得到正数的pid了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: