Unix 环境高级编程---线程创建、同步、
一下代码主要实现了linux下线程创建的基本方法,这些都是使用默认属性的。以后有机会再探讨自定义属性的情况。主要是为了练习三种基本的线程同步方法:互斥、读写锁以及条件变量。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h> int g_count = ;
pthread_mutex_t mutex_lock;
pthread_rwlock_t rw_lock;
pthread_cond_t con_val = PTHREAD_COND_INITIALIZER; typedef enum
{
MutexLock = ,
RWLock,
CondLock
}LockType; typedef struct
{
int val;
LockType type;
}ThreadData; void PrintThreadId()
{
pid_t pid;
pthread_t tid; pid = getpid();
tid = pthread_self(); printf("[%s] process id : %d thread id : 0x%lx\n",__func__,pid,tid);
} void CleanUpFun(void *arg)
{ printf("[%s] clean up : %s \n",__func__,(char *)arg);
} void AddCount(int tid,LockType type)
{
if(type == MutexLock)
{
printf("[%s] thread %d MutexLock the count is : %d\n",__func__,tid,g_count);
pthread_mutex_lock(&mutex_lock);
while(g_count < )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count++;
}
printf("\n");
pthread_mutex_unlock(&mutex_lock);
} if(type == RWLock)
{
pthread_rwlock_wrlock(&rw_lock);
printf("[%s] thread %d RWLock the count is : %d\n",__func__,tid,g_count);
while(g_count < )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count++;
}
printf("\n");
pthread_rwlock_unlock(&rw_lock); } if(type == CondLock)
{
printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count);
pthread_mutex_lock(&mutex_lock); g_count = ;
printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count); pthread_mutex_unlock(&mutex_lock); pthread_cond_signal(&con_val);
} } void DelCount(int tid,LockType type)
{
usleep(); if(type == MutexLock)
{
pthread_mutex_lock(&mutex_lock); printf("[%s] thread %d MutexLock the count is : %d\n",__func__,tid,g_count);
while(g_count > )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count--;
}
printf("\n");
pthread_mutex_unlock(&mutex_lock);
} if(type == RWLock)
{
pthread_rwlock_wrlock(&rw_lock); printf("[%s] thread %d RWLock the count is : %d\n",__func__,tid,g_count);
while(g_count > )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count--;
}
printf("\n");
pthread_rwlock_unlock(&rw_lock); } if(type == CondLock)
{
pthread_mutex_lock(&mutex_lock); // printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count); //while(1)
{
pthread_cond_wait(&con_val,&mutex_lock); printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count);
} pthread_mutex_unlock(&mutex_lock);
} } void PrintCount(int tid,LockType type)
{
if(type == RWLock)
{
pthread_rwlock_rdlock(&rw_lock); printf("[%s] thread %d RWLock the count is : %d\n",__func__,tid,g_count); pthread_rwlock_unlock(&rw_lock);
}
else
{ } } void ChangCount(int tid,LockType type)
{ if((tid == ) || (tid == ))
{
AddCount(tid,type);
}
else if((tid == ))
{
DelCount(tid,type);
}
else if(tid == )
{
PrintCount(tid,type);
} } void * ThreadFun(ThreadData *t)
{
printf("\n----------------------------------------------------------\n"); int val = ;
LockType type = ;
val = t->val;
type = t->type; printf("[%s] this is thread %d\n",__func__,val);
PrintThreadId(); char buf[];
sprintf(buf,"thread %d first handler ",val);
pthread_cleanup_push(CleanUpFun,buf);/*push and pop must be coupled*/ int len = strlen(buf);
sprintf(buf+len+,"thread %d second handler ",val);/*Notice !!! */
pthread_cleanup_push(CleanUpFun,buf+len+);/*the buf must start from different address , to the cleanupfunc ,the poniter is the same !!!*/ ChangCount(val,type); if(val == )
{
printf("----------------------------------------------------------\n");
return ((void *)val);/*clean up func won't run*/
}
else
{
printf("----------------------------------------------------------\n");
pthread_exit((void *)val);/*clean up func won run*/
}
pthread_cleanup_pop();
pthread_cleanup_pop(); return ((void *)val);
} void JoinThread(pthread_t tid)
{
void * ret; int err; err = pthread_join(tid,&ret); if(err != )
{
printf("error to join thread %lu\n",tid);
} printf("\n[%s] catch thread 0x%lx , the return val is %d\n",__func__,tid,(int)ret);
} void CreateThread(LockType type)
{
int err; ThreadData t1;
ThreadData t2;
ThreadData t3; t1.val = ;
t2.val = ;
t3.val = ; pthread_t tid_1;
pthread_t tid_2;
pthread_t tid_3; if(type == MutexLock)
{
/*Mutex lock*/
t1.type = MutexLock;
t2.type = MutexLock;
t3.type = MutexLock; err = pthread_create(&tid_1,NULL,(void *)ThreadFun,(void *)&t1);
if(err != )
{
printf("error to create thread !\n");
} err = pthread_create(&tid_2,NULL,(void *)ThreadFun,(void *)&t2);
if(err != )
{
printf("error to create thread !\n");
} JoinThread(tid_1);
JoinThread(tid_2); }
else if(type == RWLock)
{
/*rw lock*/
t1.type = RWLock;
t2.type = RWLock;
t3.type = RWLock; err = pthread_create(&tid_1,NULL,(void *)ThreadFun,(void *)&t1);
if(err != )
{
printf("error to create thread !\n");
} err = pthread_create(&tid_2,NULL,(void *)ThreadFun,(void *)&t2);
if(err != )
{
printf("error to create thread !\n");
} err = pthread_create(&tid_3,NULL,(void *)ThreadFun,(void *)&t3);
if(err != )
{
printf("error to create thread !\n");
}
JoinThread(tid_1);
JoinThread(tid_2);
JoinThread(tid_3);
}
else if(type == CondLock)
{
t1.type = CondLock;
err = pthread_create(&tid_1,NULL,(void *)ThreadFun,(void *)&t1);
if(err != )
{
printf("error to create thread !\n");
} sleep();
t2.type = CondLock;
err = pthread_create(&tid_2,NULL,(void *)ThreadFun,(void *)&t2);
if(err != )
{
printf("error to create thread !\n");
}
JoinThread(tid_1);
JoinThread(tid_2); } } void InitMutexLock()
{
if(pthread_mutex_init(&mutex_lock,NULL) != )
{
printf("[Main] error to init mutex lock\n");
}
} void DestoryMutexLock()
{
if(pthread_mutex_destroy(&mutex_lock) != )
{
printf("[Main] error to destory mutex lock\n");
}
} void DestoryRWLock()
{
if(pthread_rwlock_destroy(&rw_lock) != )
{
printf("[Main] error to destroy rw lock \n");
} } void InitRWLock()
{
if(pthread_rwlock_init(&rw_lock,NULL) != )
{
printf("[Main] error to init rw lock\n");
}
} int main(int argc,char **argv)
{
printf("=====================================mutex lock=====================================\n"); InitMutexLock(); CreateThread(MutexLock); DestoryMutexLock(); printf("=====================================rw lock=====================================\n"); InitRWLock(); CreateThread(RWLock); DestoryRWLock(); printf("=====================================Cond lock=====================================\n"); InitMutexLock(); CreateThread(CondLock); DestoryMutexLock();
printf("[Main] quit\n"); return ;
}
运行效果如下:
tiger@ubuntu:/mnt/hgfs/e/Lessons/MyExercise/UtilLibs/THREAD$ ./thread
=====================================mutex lock===================================== ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6f54b70
[AddCount] thread MutexLock the count is : ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb7755b70
- - - - - - - - - -
----------------------------------------------------------
[DelCount] thread MutexLock the count is :
- [CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler
- - - - - - - - -
---------------------------------------------------------- [JoinThread] catch thread 0xb7755b70 , the return val is [JoinThread] catch thread 0xb6f54b70 , the return val is
=====================================rw lock===================================== ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6753b70
[PrintCount] thread RWLock the count is :
----------------------------------------------------------
[CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb7755b70
[AddCount] thread RWLock the count is : ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6f54b70
- - - - - - - - - -
----------------------------------------------------------
[CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler
[DelCount] thread RWLock the count is :
- - - - - - - - - -
---------------------------------------------------------- [JoinThread] catch thread 0xb6f54b70 , the return val is [JoinThread] catch thread 0xb7755b70 , the return val is [JoinThread] catch thread 0xb6753b70 , the return val is
=====================================Cond lock===================================== ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6753b70 ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb7755b70
[AddCount] thread CondLock the count is :
[AddCount] thread CondLock the count is :
[DelCount] thread CondLock the count is :
---------------------------------------------------------- [JoinThread] catch thread 0xb6753b70 , the return val is
----------------------------------------------------------
[CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler [JoinThread] catch thread 0xb7755b70 , the return val is
[Main] quit
tiger@ubuntu:/mnt/hgfs/e/Lessons/MyExercise/UtilLibs/THREAD$
代码相当拙劣基础,欢迎拍砖。
Unix 环境高级编程---线程创建、同步、的更多相关文章
- UNIX环境高级编程——线程属性
pthread_attr_t 的缺省属性值 属性 值 结果 scope PTHREAD_SCOPE_PROCESS 新线程与进程中的其他线程发生竞争. detachstate PTHREAD_CREA ...
- UNIX环境高级编程——线程
线程包含了表示进程内执行环境必需的信息,其中包括进程中标示线程的线程ID.一组寄存器值.栈.调度优先级和策略.信号屏蔽字.errno变量以及线程私有数据. 进程的所有信息对该进程的所有线程都是共享的, ...
- UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)
一.使用互斥锁 1.初始化互斥量 pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量 int pthread_mutex_init( ...
- UNIX环境高级编程——线程同步之条件变量以及属性
条件变量变量也是出自POSIX线程标准,另一种线程同步机制.主要用来等待某个条件的发生.可以用来同步同一进程中的各个线程.当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来 ...
- UNIX环境高级编程——线程同步之读写锁以及属性
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...
- UNIX环境高级编程——线程同步之互斥量
互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程.当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步. 互斥量,从字面上就可以知道 ...
- UNIX环境高级编程——线程和fork
当线程调用fork时,就为子进程创建了整个进程地址空间的副本.子进程通过继承整个地址空间的副本,也从父进程那里继承了所有互斥量.读写锁和条件变量的状态.如果父进程包含多个线程,子进程在fork返回以后 ...
- UNIX环境高级编程——线程私有数据
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变 ...
- UNIX环境高级编程——线程属性之分离属性
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: int pthread_join(pthread_t tid, v ...
随机推荐
- Mybatis 插入与批量插入以及多参数批量删除
实体类: import java.io.Serializable; public class AttachmentTable implements Serializable { private sta ...
- 漫游Kafka实战篇之搭建Kafka运行环境
接下来一步一步搭建Kafka运行环境. Step 1: 下载Kafka 点击下载最新的版本并解压. > tar -xzf kafka_2.9.2-0.8.1.1.tgz > cd kafk ...
- js数组的声明与应用
js数组的声明与应用 数组:一种容器,存储批量数据.JavaScript是一种弱类型语言.什么是弱类型,就是变量可以存储多种类型变量的引用不会报错.所以js数组可以存储不同的数据. 一.数组的作用:只 ...
- Java循环语句之 for
Java 的循环结构中除了 while 和 do...while 外,还有 for 循环,三种循环可以相互替换. 语法: 执行过程: <1>. 执行循环变量初始化部分,设置循环的初始状态, ...
- Android adb shell命令大全
1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): androi ...
- YII Framework学习教程-YII的国际化
一个web应用,发布到互联网,就是面向全球用户.用户在世界的各个角落都可以访问到你的web应用,当然要看你的网站和不和谐,不和谐的web应用在和谐社会是不让你访问的. YII提供了国际化的支持,可以让 ...
- 一致性Hash算法在Memcached中的应用
前言 大家应该都知道Memcached要想实现分布式只能在客户端来完成,目前比较流行的是通过一致性hash算法来实现.常规的方法是将server的hash值与server的总台数进行求余,即hash% ...
- 五种情况会导致Session 丢失
1.Session到期自定丢失.2.当修改web.config 系统会重启 SESSION 会丢失.3.Bin目录有变化时候系统会重启 SESSION会丢失 (这里变化指的是,创建新文件.修改文件名 ...
- 《Windows核心编程》第5版 学习进度备忘
学习资源:<Windows核心编程>第5版 知识基础支持: 本书与<Windows程序设计>第5版珍藏版结合很好,二者重叠内容不多,二者互补性强,而且相关方面的优秀书籍 跳过的 ...
- JavaScript 教程学习进度备忘(二)
备忘:之前,只将“JS 教程”学习完毕,这篇记录:“JS HTML DOM ”.“JS 对象”.“JS Window”.“JS 库” 书签:跳过:另外跳过的内容有待跟进 _______________ ...