这里是多线程,而不是多进程。我们用fork函数可以创建子进程,创建的子进程是和源程序完全一样的,但是有自己的堆栈,代码段,数据段,BSS端,而且当源进程关闭的时候,创建的新进程不会关闭,就相当于是复制出完全一样的两个程序在运行。
printf("num 1\n");
sleep(1);
printf("num 2\n");
pthread_exit(NULL);
printf("num 3\n");
pthread_exit(NULL);
pthread_mutex_lock(&mut);
printf("num 1\n");
sleep(1);
printf("num 2\n");
pthread_mutex_unlock(&mut);
pthread_exit(NULL);
pthread_mutex_lock(&mut);
printf("num 3\n");
pthread_mutex_unlock(&mut);
pthread_exit(NULL);
pthread_mutex_lock(&mut);
printf("num 1\n");
sleep(1);
printf("num 2\n");
pthread_mutex_unlock(&mut);
sleep(2);
pthread_mutex_lock(&mut);
printf("num 4\n");
pthread_mutex_unlock(&mut);
pthread_exit(NULL);
pthread_mutex_lock(&mut);
printf("num 3\n");
pthread_mutex_unlock(&mut);
pthread_exit(NULL);
pthread_mutex_lock(&mut);
printf("num 1\n");
sleep(1);
printf("num 2\n");
pthread_mutex_unlock(&mut);
sleep(2);
pthread_mutex_lock(&mut);
printf("num 4\n");
pthread_mutex_unlock(&mut);
pthread_exit(NULL);
pthread_mutex_lock(&mut);
printf("num 3\n");
pthread_mutex_unlock(&mut);
pthread_exit(NULL);
pthread_mutex_init(&mut, NULL);
//创建工人1线程
pthread_create(&thread[0], NULL, work1, NULL);
//创建工人2线程
pthread_create(&thread[1], NULL, work2, NULL);
//等待工人1线程的结束
pthread_join(thread[0], NULL);
//等待工人2线程的结束
pthread_join(thread[1], NULL);
但是这里的线程就不一样了。它在源程序里创建了一个新线程,这个线程不是源程序的完全复制,它和源程序共用同个资源,是源程序为了提高效率让多个线程同时执行某一项操作。
相关函数
创建线程
pthread_create
等待线程
pthread_join
结束线程
pthread_exit
相关辅助函数(线程互斥锁)
当多个线程对同一个公共资源进行操作时,就会碰到和多进程是一样的问题,多个线程不能同时对同一个资源进行访问操作,在进程间通信时用的是信号量来实现进程间互斥,这里用线程互斥锁。
初始化线程互斥锁
pthread_mutex_init
获取线程互斥锁
pthread_mutex_lock
解开线程互斥锁
pthread_mutex_unlock
用pthread_mutex_t mymutex,可以定义一个mymutex的互斥锁,用
pthread_mutex_init来初始化这个互斥锁,
pthread_mutex_lock和
pthread_mutex_unlock分别为加锁和解锁
如果man不到这些函数
举个例子
当两个线程是这样的
void * work1()
{
}
void * work2()
{
}
显示的结果是
当加入互斥锁后
void * work1()
{
}
void * work2()
{
}
结果就变成这样了
void * work1()
{
}
void * work2()
{
}
贴上所有代码
#include
#include
pthread_t thread[2];
int number = 0;
pthread_mutex_t mut;
void * work1()
{
}
void * work2()
{
}
void main()
{
}
多线程之间还可以用条件变量来减少等待线程对CPU的占用
初始化
pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;
等待条件成熟
pthread_cond_wait(&cond_ready, &mut);
设置条件成熟
pthread_cond_signal(&cond_ready);