既然pthread mutex unlock可以用mutex来lock/unlock,为什么还要引入pthread mutex unlock

当前访客身份:游客 [
当前位置:
发布于 日 22时,
1 pthread_mutex_t
2 pthread_cond_t
3 pthread_mutex_init/lock/unlock
4 pthread_cond_unit/wait/signal
代码片段(1)
1.&[代码][C/C++]代码&&&&
#include &pthread.h&
#include &stdio.h&
pthread_cond_t m_
pthread_mutex_t m_
void *threadFunc(void * pm_iPthreadId)
pthread_mutex_lock(&m_lock);
unsigned int iId = *(unsigned int *) pm_iPthreadId;
printf("### No.% pthread id = %u !\n", iId, pthread_self());
pthread_cond_signal(&m_cond);
int cnt = 0;
time_t iStartTime = time(NULL);
time_t iTempTime = time(NULL);
if (iTempTime - iStartTime & 2)
printf("$$$ NO.%d pthread cirle exec, cnt is %d !\n",*(unsigned int *)pm_iPthreadId, cnt);
iStartTime = time(NULL);
pthread_mutex_unlock(&m_lock);
======================================================================
Description:
* =====================================================================================
main ( int argc, char *argv[] )
pthread_mutex_init(&m_lock, NULL);
pthread_cond_init(&m_cond, NULL);
pthread_t *pthreadId;
pthreadId = new pthread_t[10];
for (unsigned int i = 0; i & 10; i++)
pthread_mutex_lock(&m_lock);
int iRet = pthread_create(pthreadId + i, NULL, threadFunc, &i);
if (iRet == 0)
printf("@@@ create No.%d pthread success, pthreadId = %u !\n", i, pthreadId + i);
pthread_cond_wait(&m_cond, &m_lock);
pthread_mutex_unlock(&m_lock);
开源中国-程序员在线工具:
主线程对资源加锁没有释放,子线程怎么能加锁成功呢?
2楼:thousandthunder 发表于
此代码作用是 让子线程依次顺序执行,但是线程的设计初衷就是并行运行的,楼主这样做有啥特殊用处?
3楼:恋恋美食 发表于
我犯2了。昨天翻了翻UNIX网络编程,
pthread_cond_wait(&m_cond, &m_lock)是先解锁再进入睡眠的,醒来是自动再加锁。。。
看书看得不仔细啊,没用过就是不行
4楼:恋恋美食 发表于
仅仅是互斥变量与条件变量的使用示例
5楼:ayanmw 发表于
linux貌似只有pthread_t pid。没有另外的PID。windows getCurrentThreadId() 是一个 int 数字,跟PID差不多。Windows还有个 HANDLE 是创建thread的句柄,其实是地址。
也就是 linux的pid其实就是地址,没有单独的 int 数字 。
我说错没?
6楼:xRever 发表于
好像没有delete?
开源从代码分享开始
谢中辉的其他代码Linux 线程的互斥和等待 pthread_mutex_lock/pthread_mutex_unlock pthread_cond_wait/pthread_co... - 推酷
Linux 线程的互斥和等待 pthread_mutex_lock/pthread_mutex_unlock pthread_cond_wait/pthread_co...
#include &pthread.h&
pthread_mutex_
pthread_cond_
bool exit_void init() {
pthread_mutex_init(mutex, NULL);
pthread_cond_init(mwait, NULL);
}void relese() {
exit_sign = 1;
pthread_mutex_unlock(mutex);
pthread_cond_signal(mwait);
pthread_mutex_destroy(mutex);
pthread_cond_destroy(mwait);
}void pushD(D *data) {
pthread_mutex_lock(&D_mutex);
if (D_queue.size() &= maxQueueSize) {
delete (D_queue.front());
D_queue.pop();   }
D_queue.push(data);
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&mwait);
D* popD() {
pthread_mutex_lock(&mutex);
D *d = NULL;
while (D_queue.size() &= 0 && !exit_sign) {
pthread_cond_wait(&mwait, &mutex);
if (exit_sign) {
return NULL;
d = D_queue.front();
D_queue.pop();
pthread_mutex_unlock(&mutex);
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见14712人阅读
& & &在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。
一,锁的创建
& & 锁可以被动态或静态创建,可以用宏PTHREAD_MUTEX_INITIALIZER来静态的初始化锁,采用这种方式比较容易理解,互斥锁是pthread_mutex_t的结构体,而这个宏是一个结构常量,如下可以完成静态的初始化锁:
& & pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
& & 另外锁可以用pthread_mutex_init函数动态的创建,函数原型如下:
& &&int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)
二,锁的属性
& & 互斥锁属性可以由pthread_mutexattr_init(pthread_mutexattr_t *mattr);来初始化,然后可以调用其他的属性设置方法来设置其属性;
& & 互斥锁的范围:可以指定是该进程与其他进程的同步还是同一进程内不同的线程之间的同步。可以设置为PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE。默认是后者,表示进程内使用锁。可以使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)
pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)
用来设置与获取锁的范围;
& & 互斥锁的类型:有以下几个取值空间:
  PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
  PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
  PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
  PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)
获取或设置锁的类型。
三,锁的释放
& & 调用pthread_mutex_destory之后,可以释放锁占用的资源,但这有一个前提上锁当前是没有被锁的状态。
四,锁操作
& & 对锁的操作主要包括加锁 pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁 pthread_mutex_trylock()三个。
  int pthread_mutex_lock(pthread_mutex_t *mutex)
  int pthread_mutex_unlock(pthread_mutex_t *mutex)
  int pthread_mutex_trylock(pthread_mutex_t *mutex)
  pthread_mutex_trylock()语义与pthread_mutex_lock()类似,不同的是在锁已经被占据时返回EBUSY而不是挂起等待
五,锁的使用
#include &pthread.h&
#include &stdio.h&
pthread_mutex_
void *print_msg(void *arg){
pthread_mutex_lock(&mutex);
for(i=0;i&15;i++){
printf(&output : %d\n&,i);
usleep(100);
pthread_mutex_unlock(&mutex);
int main(int argc,char** argv){
pthread_t id1;
pthread_t id2;
pthread_mutex_init(&mutex,NULL);
pthread_create(&id1,NULL,print_msg,NULL);
pthread_create(&id2,NULL,print_msg,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_mutex_destroy(&mutex);
将会一个线程一个线程的执行。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(1)(10)(13)(59)10925人阅读
pthread_mutex_lock, pthread_mutex_trylock,
pthread_mutex_unlock - lock and unlock a mutex
#include &&
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_mutex_lock()函数锁住由mutex指定的mutex
对象。如果mutex已经被锁住,调用这个函数的线程阻塞直到mutex可用为止。这跟函数返回的时候参数mutex指定的mutex对象变成锁住状态,同时该函数的调用线程成为该mutex对象的拥有者。
如果mutex 对象的type是
PTHREAD_MUTEX_NORMAL,不进行deadlock
detection(死锁检测)。企图进行relock
这个mutex会导致deadlock.
如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,结果是不未知的。
如果mutex类型是
PTHREAD_MUTEX_ERRORCHECK,那么将进行错误检查。如果一个线程企图对一个已经锁住的mutex进行relock,将返回一个错误。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。
如果mutex类型是
PTHREAD_MUTEX_RECURSIVE,mutex会有一个锁住次数(lock
count)的概念。当一个线程成功地第一次锁住一个mutex的时候,锁住次数(lock
count)被设置为1,每一次一个线程unlock这个mutex的时候,锁住次数(lock
count)就减1。当锁住次数(lock
count)减少为0的时候,其他线程就能获得该mutex锁了。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。
如果mutex类型是
PTHREAD_MUTEX_DEFAULT,企图递归的获取这个mutex的锁的结果是不确定的。unlock一个不是被调用线程锁住的mutex的结果也是不确定的。企图unlock一个未被锁住的mutex导致不确定的结果。
pthread_mutex_trylock()调用在参数mutex指定的mutex对象当前被锁住的时候立即返回,除此之外,pthread_mutex_trylock()跟pthread_mutex_lock()功能完全一样。
pthread_mutex_unlock()函数释放有参数mutex指定的mutex对象的锁。如果被释放取决于该Mutex对象的类型属性。如果有多个线程为了获得该mutex锁阻塞,调用pthread_mutex_unlock()将是该mutex可用,一定的调度策略将被用来决定哪个线程可以获得该mutex锁。(在mutex类型为PTHREAD_MUTEX_RECURSIVE
的情况下,只有当lock
count 减为0并且调用线程在该mutex上已经没有锁的时候)(翻译到这里,才觉得我的这个锁概念是多么模糊)
如果一个线程在等待一个mutex锁得时候收到了一个signal,那么在从signal
handler返回的时候,该线程继续等待该mutex锁,就像这个线程没有被中断一样。
成功,pthread_mutex_lock()
和 pthread_mutex_unlock()
返回0,否则返回一个错误的提示码
pthread_mutex_trylock()
在成功获得了一个mutex的锁后返回0,否则返回一个错误提示码
pthread_mutex_lock() 和
pthread_mutex_unlock()失败的时候
mutex在生成的时候,它的protocol属性的值是
PTHREAD_PRIO_PROTECT,同时调用线程的优先级(priority)比该mutex的当前prority上限高
pthread_mutex_trylock() 函数在一下情况会失败:
The mutex could not be acquired because it was already
mutex已经被锁住的时候无法再获取锁
The pthread_mutex_lock(), pthread_mutex_trylock()
and pthread_mutex_unlock() functions may fail if:
mutex指向的mutex未被初始化
Mutex的lock count(锁数量)已经超过
递归索的最大值,无法再获得该mutex锁
pthread_mutex_lock() 函数在一下情况下会失败:
当前线程已经获得该mutex锁
pthread_mutex_unlock() 函数在以下情况下会失败:
当前线程不是该mutex锁的拥有者
所有的这些函数的错误返回值都不会是[EINTR]
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:22460次
排名:千里之外
原创:12篇
(1)(1)(1)(2)(3)(3)(4)(3)pthread_cond_signal(&empty);//这句不执行,下句pthread_mutex_unlock(&lock);也跟着不执行?
[问题点数:20分,结帖人mirro187]
pthread_cond_signal(&empty);//这句不执行,下句pthread_mutex_unlock(&lock);也跟着不执行?
[问题点数:20分,结帖人mirro187]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
2012年5月 专题开发/技术/项目大版内专家分月排行榜第二2010年3月 C/C++大版内专家分月排行榜第二
2012年4月 Linux/Unix社区大版内专家分月排行榜第三2011年7月 Linux/Unix社区大版内专家分月排行榜第三2010年2月 C/C++大版内专家分月排行榜第三
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 pthread spin lock 的文章

 

随机推荐