Chinaunix

标题: 关于pthread_mutex_lock排队的问题 [打印本页]

作者: 还不错    时间: 2008-11-14 10:22
标题: 关于pthread_mutex_lock排队的问题
void A()
{
while(1)
{
pthread_mutex_lock(&lock);
……;
pthread_mutex_unlock(&lock);
}
}

void B()
{
while(1)
{
pthread_mutex_lock(&lock);
……;
pthread_mutex_unlock(&lock);
}
}

如果是类似如上的代码,B线程根本没有抢到lock资源的机会,pthread的策略好像是按照线程的优先级顺序加锁,是否有办法按照排队的先后顺序进行加锁了(除了unlock后delay的方式)?象windows的EnterCriticalSection

[ 本帖最后由 还不错 于 2008-11-14 10:47 编辑 ]
作者: yangsf5    时间: 2008-11-14 11:24
你创建锁的时候,不创建优先级的试试?
作者: timespace    时间: 2008-11-14 12:15
标题: 回复 #1 还不错 的帖子
如果是类似如上的代码,B线程根本没有抢到lock资源的机会,pthread的策略好像是按照线程的优先级顺序加锁

从哪里得出这个结论?
作者: chenzhanyiczy    时间: 2008-11-14 12:43
线程的优先级是由内核调度的,不过你也可以改变线程的优先级,但需要root权限
作者: w_anthony    时间: 2008-11-14 13:13
两个线程都是while(1),没有sleep,确实很可能会出现B线程“抢”不到执行权的情况。。。

因为你很难保证从A线程切换出去的时候,是在unlock之后。
如果是在lock和unlock之间从A线程切换到B线程,B还被lock着,结果又切换了回来。
而实际上,由于lock和unlock之间的是业务逻辑,执行时间必定会比外面的时间长,这样绝大部分的线程切换都发生在了这里。
作者: 还不错    时间: 2008-11-14 15:27
原帖由 yangsf5 于 2008-11-14 11:24 发表
你创建锁的时候,不创建优先级的试试?

我没有创建优先级
作者: 还不错    时间: 2008-11-14 15:27
原帖由 timespace 于 2008-11-14 12:15 发表

从哪里得出这个结论?


当然是我写程序测试了的
作者: camperbird    时间: 2008-11-14 16:33
pthread_setconcurrency(2) ?
或者测试数据太小了?
作者: timespace    时间: 2008-11-14 16:45
原帖由 还不错 于 2008-11-14 15:27 发表


当然是我写程序测试了的

可否贴下测试代码?
作者: 还不错    时间: 2008-11-17 16:56
原帖由 timespace 于 2008-11-14 16:45 发表

可否贴下测试代码?


#include<pthread.h>
#include<stdio.h>

#define HTCNT 2

pthread_mutex_t                        mutex;
int cnt=0;
int mpr[HTCNT];
pthread_t thread[HTCNT];

void *POO(void *v_pthread)
{
        int mr=*(int *)v_pthread;
        while(1)
        {
                pthread_mutex_lock(&mutex);
                if(cnt<200)
                {
                        printf("[%d][%d]\n",mr+1,++cnt);
                }
                else
                {
                        break;
                }
                pthread_mutex_unlock(&mutex);
                //usleep(10*1000);
        }
}

int main()
{
        int i;
        if(pthread_mutex_init(&mutex,NULL)!=0)
        {
                return 0;
        }
        for(i=0;i<HTCNT;i++)
        {
                mpr=i;
                if (pthread_create(&thread, NULL, POO, &mpr) != 0)
                {
                        return 0;
                }
        }
        getchar();
                return 1;
}


上述代码仅为了验证标题,未对线程回收等。
代码打印结果仅有第一个线程的数据,如果去掉usleep(10*1000);前的注释,可以发现是线程轮流抢到lock
作者: timespace    时间: 2008-11-17 19:16
原帖由 还不错 于 2008-11-17 16:56 发表


#include
#include

#define HTCNT 2

pthread_mutex_t                        mutex;
int cnt=0;
int mpr[HTCNT];
pthread_t thread[HTCNT];

void *POO(void *v_pthread)
{
        int mr=*(int *)v_pthread;
        while(1 ...


首先编写正确的代码才能清晰的阐述问题,在linux 2.6.9运行正确的程序两个线程均由机会运行
        for(i=0;i<HTCNT;i++)
        {
                mpr[i] = i;
                if (pthread_create(&thread[i], NULL, POO, &mpr[i]) != 0)
                {
                        return 0;
                }
        }

作者: 还不错    时间: 2008-11-18 09:59
原帖由 timespace 于 2008-11-17 19:16 发表


首先编写正确的代码才能清晰的阐述问题,在linux 2.6.9运行正确的程序两个线程均由机会运行
        for(i=0;i



不好意思,程序中确实是写得&mpr,粘贴到论坛来就没有""了。因为我都测试了去掉usleep(10*1000);的注释是可以有机会运行的

[ 本帖最后由 还不错 于 2008-11-18 12:19 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2