日期:2014-05-16  浏览次数:20624 次

循序渐进学unix——上机记录(八),Thread

本次上机主题为线程。一个程序可以包含多个进程,而一个进程又可以创建多个线程,每个线程都共享此进程的上下文环境。

在unix下使用gcc编译带有线程操作的程序时需要加上 -pthread选项。

基本的线程函数:

#include <pthread.h>

创建线程:后两个参数为待调用的函数及传递的参数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);
在进程中等待相应线程的结束:

int pthread_join(pthread_t thread, void **retval);

1,创建一个能实现两数相加的线程,使用3个线程实现(a + b) * (c + d)/(e + f)。为此,我们使用一个结构体传递加数及结果:

typedef struct _Calcul { float op1, op2, result; } Calcul;

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

typedef struct _Calcul{ float op1, op2, result;}Calcul;
void somme(Calcul* calcul)
{
	calcul->result = calcul->op1 + calcul->op2;
}
 
void main()
{
	int val_return;
	int **res1, res2, res3;
	pthread_t ptr1, ptr2, ptr3;
	Calcul calcul1, calcul2, calcul3;
	calcul1.op1=1;
	calcul1.op2=2;
	calcul2.op1=3;
        calcul2.op2=4;
	calcul3.op1=5;
        calcul3.op2=16;

	if( (val_return=pthread_create(&ptr1, NULL, (void*)somme, (void*)(&calcul1) )) != 0)
	{	
		perror("pthread_create");exit(1);
	}
	if( (val_return=pthread_create(&ptr2, NULL, (void*)somme, (void*)(&calcul2) )) != 0)
	{	
		perror("pthread_create");exit(1);
	}
	if( (val_return=pthread_create(&ptr3, NULL, (void*)somme, (void*)(&calcul3) )) != 0)
	{	
		perror("pthread_create");exit(1);
	}
	pthread_join( ptr1, NULL);//(void**)res1);
	pthread_join( ptr2, NULL);//(void**)res1);
	pthread_join( ptr3, NULL);//(void**)res1);
	printf("(1+2)*(3+4)/(5+16)=%f\n", calcul1.result * calcul2.result / calcul3.result);
} 

2,使用互斥(mutex)实现对共享资源的访问,涉及到的函数有:

int pthread_mutex_init(pthread_mutex_t *restrict mutex,
                                const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *