线程概念:
在LinuxC中,创建进程fork(),创建线程pthread_creat()。用户在创建进程时,系统要为其分配内存空间(代码段,堆,栈等),创建线程不开辟内存空间,线程是进程中的一条执行路径,线程之间共享进程的内存。
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix和类Unix操作系统中线程也被称为轻量级进程(lightweight processes),但轻量级进程更多指的是内核线程(kernel thread),而把用户线程(user thread)称为线程。
线程的API:
创建: int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
第一个参数:pthread_t 的指针变量,第二个参数:线程类型,默认为NULL,第三个参数:指针函数名,第四个参数:无类型指针函数变量名。
关闭: void pthread_exit(void *retval);// 参数是无类型指针的变量,变量是创建的线程定义的。
阻塞:int pthread_join(pthread_t thread, void **retval);
第一个参数 :pthread_t 的指针变量,第二个参数:无类型二级指针。
锁he条件控制//mutex&cond
初始化:pthread_cond_init();//还可以宏定义pthread_cond_t cond = PTHREAD_COND_INITIALIZER
pthread_mutex_init();//还可以宏定义pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
销毁:pthread_cond_destroy(); pthread_mutex_destroy();
开解锁: pthread_mutex_lock(); pthread_mutex_unlock();
触发/等待: pthread_cond_signal();pthread_cond_wait();
API应用程序:
#include <stdio.h>
#include <pthread.h>
int g_data =0;
pthread_mutex_t mutex;
pthread_cond_t cond;
//pthread_mutex_init(&mutex,NULL);
//int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
// void *(*start_routine) (void *), void *arg);
void *func1(void *arg)
{
static char *ret = "99out";
printf("zi jingchen :%ld\n",(unsigned long)pthread_self());
printf("t1zifu:%s\n",((char*)arg));
//pthread_exit((void*)ret);
while(1){
pthread_cond_wait(&cond,&mutex);
printf("t1=%d\n",g_data);
g_data=0;
sleep(1);
}
pthread_exit((void*)ret);
void *func2(void *arg)
{
int i;
// pthread_mutex_lock(&mutex);
static char *ret = "99out";
printf("zi jingchen :%ld\n",(unsigned long)pthread_self());
printf("t1zifu:%s\n",((char*)arg));
// pthread_exit((void*)ret);
while(1){
pthread_mutex_lock(&mutex);
printf("t2=%d",g_data++);
if(g_data==5){
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main()
{
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&cond,NULL);
int ret;
char *pret=NULL;
char* zifu="yichuanshuzi";
pthread_t t1;
pthread_t t2;
ret=pthread_create(&t1,NULL,func1,(void *)zifu);
pthread_create(&t2,NULL,func2,(void*)zifu);
if(ret==0){
printf("create fixiancheng success\n");
}
pthread_join(t1,NULL);
pthread_join(t2,NULL);
//pthread_join(t2,(void**)&pret);
//pthread_join(t1,(void**)&pret);
printf("main:t1 quit%s\n",pret);
printf("main:%ld\n",(unsigned long)pthread_self());
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
运行结果:
上面程序为各类API应用。