今天主要学习了线程的两种退出方式以及分离线程和互斥锁
一,进程结束
1.从线程执行函数中return
2.pthread_cancel发送取消请求
3.任何一个函数使用exit或主函数return
二,线程资源的回收
1.pthread_join 主线程关系子线程状态
昨天有提到
2.pthread_detach 分离线程
三,线程和进程的比较
各自特点
1.线程
创建速度快,调用速度快,并发程度更高,共享了进程的数据空间,共享数据方便,但不安全。带来资源竞争(解决竞争:互斥,同步)
进程
进程空间相互独立,安全性高,但进程间共享数据不方便。(进程间通信,管道,信号,共享内存)
四,线程间资源竞争
互斥锁
框架:定义———初始化——加锁——解锁——销毁
pthread_mutex_t() 定义
pthread_mutex_init() 初始化
pthread_mutex_lock() 加锁
pthread_mutex_unlock() 解锁
pthread_mutex_destroy() 销毁
定义exit宏 man 3 exit
int count;
void *doSth1(void *arg)
{
int i = 0;
while(i < 50000)
{
int temp = count;
printf("count 1 = %d\n",temp);
temp = temp + 1;
count = temp;
++i;
}
}
void *doSth2(void *arg)
{
int i = 0;
while(i < 50000)
{
int temp = count;
printf("count 2 = %d\n",temp);
temp = temp + 2;
count = temp;
++i;
}
}
int main(int argc, const char *argv[])
{
pthread_t tid[2];
int ret = pthread_create(&tid[0], NULL, doSth1,NULL);
if(ret != 0)
handle_error_en(ret, "pthread_create fail");
ret = pthread_create(&tid[1], NULL, doSth2,NULL);
if(ret != 0)
handle_error_en(ret, "pthread_create fail");
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
return 0;
}
未上锁
上锁&解锁&销毁
char buf[20]; //互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *doSth1(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
int i = 0;
for(i = 0; i < 10; ++i)
{
buf[i] = 'a' + i;
}
printf("Sth1 buf = %s\n",buf);
pthread_mutex_unlock(&mutex);
}
}
void *doSth2(void *arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
int i = 0;
for(i = 0; i < 10; ++i)
{
buf[i] = '0' + i;
}
printf("Sth2 buf = %s\n",buf);
pthread_mutex_unlock(&mutex);
}
}
int main(int argc, const char *argv[])
{
pthread_t tid[2];
int ret = pthread_create(&tid[0], NULL, doSth1,NULL);
if(ret != 0)
handle_error_en(ret, "pthread_create fail");
ret = pthread_create(&tid[1], NULL, doSth2,NULL);
if(ret != 0)
handle_error_en(ret, "pthread_create fail");
pthread_join(tid[0],NULL);
pthread_join(tid[1],NULL);
pthread_mutex_destroy(&mutex);
return 0;
}