tklist 发表于 2014-06-02 10:56

问一个linux多线程里面锁的问题

之前在c/c++版提问过没人回答,在这个版提问,不知道有人解答吗?#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
static pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

int global_val = 0;

void* test(void *argv) {
    printf("test before lock\n");
    pthread_mutex_lock(&mtx);
    while(global_val == 0) {
      pthread_cond_wait(&cond,&mtx);
    }
    pthread_mutex_unlock(&mtx);
    printf("@@@@@%d\n",global_val);
}
void* add(void *argv) {
    sleep(1);
    printf("add before lock\n");
    pthread_mutex_lock(&mtx);
    global_val++;
    printf("###%d\n",global_val);
    pthread_mutex_unlock(&mtx);
   
}
int main() {
    pthread_t tid1,tid2;
    global_val = 0;
    pthread_create(&tid1,NULL,test,NULL);
    sleep(1);
    pthread_create(&tid2,NULL,add,NULL);
    printf("main begin\n");
    pthread_mutex_lock(&mtx);
    global_val = 5;
    sleep(3);
    pthread_cond_signal(&cond);
    printf("signal over before unlock\n");
    sleep(3);
    pthread_mutex_unlock(&mtx);
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
}我要模拟的情况是有一个test线程阻塞在pthread_cond_wait(&cond,&mtx);,另外一个add线程阻塞在pthread_mutex_lock(&mtx);
然后主线程调用pthread_cond_signal(&cond);和pthread_mutex_unlock(&mtx); 这个时候会是哪个线程抢到锁?
pthread_cond_wait的线程会高优先级抢到锁吗,还是说随机的?
我上面测试代码是add线程抢到了锁。
我的测试代码输出:
test before lock
main begin
add before lock
signal over before unlock
###6
@@@@@6

weishuo1999 发表于 2014-06-02 16:12

这类问题,要嘛去内核那边问问,要嘛自己看看源码。

rollin7 发表于 2014-06-02 17:10

个人觉得应该是void* test(void *argv)先抢到锁,但刚才试了下,输出结果和你的相同

后来发现造成这种结果和最后一个 sleep(3)有关,也就是printf("signal over before unlock\n")紧跟的那个sleep。

此sleep好像影响到了pthread_cond_wait(&cond,&mtx)的**,至于为什么,暂时没找到答案,留给大神解决。

windoze 发表于 2014-06-02 22:59

理论上说你需要pthread_mutexattr_setprotocol(&mtx, PTHREAD_PRIO_INHERIT),但Linux下的各种调度策略(RT, FIFO等)有没有正确实现这个功能就不知道了。

tklist 发表于 2014-06-04 11:22

确实是这样的,我把那行的sleep(3)时间减少点或者注释掉,就是test线程抢到锁。回复 3# rollin7


   

MMMIX 发表于 2014-06-04 12:34

回复 1# tklist


    你这个问题的实质就是两个线程争一个锁,那么你的程序的行为就不应该依赖它们两个谁先拿到锁。如果你确实需要某个线程先于另外一个执行,那在程序逻辑设计上就要考虑这一点。

timespace 发表于 2014-06-04 13:56

这是讨论RT Linux吗?如果不是,那么结果是随机的,也就是undefined,时序用显式同步控制,不能依赖sleep这种东西。

ddm95 发表于 2014-06-04 15:00

不应该指望操作系统的进程调度会按设想的方式操作。

penghf0405 发表于 2015-04-03 01:51

有没可能主线程一直获取锁没有释放,然后就发出等待的信号,然后test线程在还没获取锁时,无法进入等待消息的状态。具体不清楚系统怎么调度的。

羽剑天涯 发表于 2015-04-03 10:10

pthread_cond_wait做的事情就是unlock、等待条件变量的通知,然后lock,在lock这个操作上与其他lock调用一起竞争,谁会获得锁,是不一定的。
页: [1]
查看完整版本: 问一个linux多线程里面锁的问题