日期:2014-05-16 浏览次数:20699 次
本次上机主题为线程。一个程序可以包含多个进程,而一个进程又可以创建多个线程,每个线程都共享此进程的上下文环境。
在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); }
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 *