linux C线程杂记
来源:互联网 发布:齐柏林飞船知乎 编辑:程序博客网 时间:2024/05/16 11:55
以前学操作系统的进程和线程管理时,经常听到互斥加锁解锁之类的概念,但是几乎很少在编程中用到,今天看《gnu/linux编程》的线程这章时,对c程序中如何给变量加锁解锁有了一个大致的了解,现记录如下:
互斥其实是保证线程在关键区正常执行的变量,同一时刻只能由某一进程访问,要建立一个关键区,首先得创建一个互斥变量,然后用特殊的符号为其常量初始化。互斥变量声明方法如下:
pthread_mutex_t test_mutex=PTHREAD_MUTEX_INITIALIZER;
互斥变量初始化有三种类型,具体的类型请google搜索。下面创建关键区:
pthread_mutex_t test_mutex=PTHREAD_MUTEXT_INITIALIZER;
。。。
/*进入关键区*/
assert(pthread_mutex_lock(&test_mutex)==0);
attr++; //要锁定的变量,同一时刻只能某一线程访问
assert(pthread_mutext_unlock(&test_mutex)==0);
/*退出关键区*/
关键区是同一时刻只允许某一线程执行的代码段,关键区的存在是为了保护共享资源,避免多重访问的发生。
pthread_mutex_trylock()方法与pthread_mutex_lock()的区别是trylock如果不能成功加锁可以干其他的事情,而不是阻塞于加锁关键区,而lock则是如不能加锁关键区则阻塞于此,直到可以加锁为止。
互斥变量用完最后得销毁,通过pthread_mutex_destroy()来销毁即可。
一个完整实例如下:
#include <pthread.h>#include <stdio.h>#include <assert.h>#define MAX 1000#define MAX_THREAD 10pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;long counter = 0L;void *mythread(void *args){ int i, ret; for(i=0; i<MAX; i++) { ret = pthread_mutex_lock(&mymutex); assert(ret == 0); counter++; ret = pthread_mutex_unlock(&mymutex); assert(ret == 0); }}int main(){ int ret, i; pthread_t threadId[MAX_THREAD]; for(i=0; i< MAX_THREAD; i++) { ret = pthread_create(&threadId[i],NULL,mythread,NULL); if(ret != 0) printf("Error creating thread %d\n",(int)threadId[i]); } for(i=0; i<MAX_THREAD; i++) { ret = pthread_join(threadId[i],NULL); if(ret != 0) printf("Error joining thread %d\n",(int)threadId[i]); } printf("The protected varible value is %ld\n",counter); ret = pthread_mutex_destroy(&mymutex); if(ret != 0) printf("Couldn't destroy the mutex\n"); return 0;}
参考:http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread.h.html
- linux C线程杂记
- linux C杂记(一)
- linux c 一站式学习 杂记
- linux学习杂记_信号_线程
- 杂记 (2) —— linux and C
- 杂记 (3) —— C and linux
- C杂记
- linux杂记
- Linux杂记
- linux 杂记
- linux 杂记
- Linux 杂记
- linux杂记
- linux杂记
- Linux 杂记
- linux 杂记
- linux杂记
- Linux 杂记
- Python学习资料
- 教程系列导航
- Java数据结构(排序篇)
- excel计算两列差的公式和方法
- C#的委托代替C++的函数指针
- linux C线程杂记
- excel表格中如何计算两个日期之间的天数?
- 升级cs项目:从vs2003项目vs2005,错误提示“项目所需的应用程序未安装,确保已安装项目类型(.csproj)的应用程序”...
- 单例(singleton)模式
- 下拉刷新以及上拉加载更多
- 易飞bom循环或超过20阶
- Android常用语句
- iOS下拉刷新的详细介绍
- SQL server 2008调试功能设置