- 论坛徽章:
- 1
|
回复 3# BsiIce
竞争肯定是会存在的,所以才用锁啊,你说的是饥饿(某个进程或线程一直不能(或很)难获得锁)吧?不知道你测试代码怎么写的,见以下代码- #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <sys/file.h>
- #include <errno.h>
- #include <string.h>
- #include <pthread.h>
- #define FLOCK_FILENAME "/tmp/flock_1503191728"
- void libfunc(const char *caller)
- {
- int fd = -1;
- int ret = -1;
- fd = open(FLOCK_FILENAME, O_RDWR | O_CREAT, 0644);
- if (-1 == fd)
- {
- printf("%s: open error: %s!\n", caller, strerror(errno));
- }
- ret = flock(fd, LOCK_EX);
- if (-1 == ret)
- {
- printf("%s: flock LOCK_EX error: %s!\n", caller, strerror(errno));
- }
- printf("%s: calling start\n", caller);
- sleep(2);
- printf("%s: calling end\n", caller);
- ret = flock(fd, LOCK_UN);
- if (-1 == ret)
- {
- printf("%s: flock LOCK_UN error: %s!\n", caller, strerror(errno));
- }
- ret = close(fd);
- if (-1 == ret)
- {
- printf("%s: close error: %s!\n", caller, strerror(errno));
- }
- usleep(1);
- }
- void *tfunc(void *arg)
- {
- while (1) {
- libfunc(arg);
- }
- }
- int main(int argc, char **argv)
- {
- pthread_t a,b;
- char *ms="m", *as="a", *bs="b";
- pthread_create(&a,NULL,tfunc, as);
- pthread_create(&b,NULL,tfunc, bs);
- while (1) {
- libfunc(ms);
- }
- return 0;
- }
复制代码 测试的输出如下:- a: calling start
- a: calling end
- m: calling start
- m: calling end
- b: calling start
- b: calling end
- a: calling start
- a: calling end
- b: calling start
- b: calling end
- m: calling start
- m: calling end
- a: calling start
- a: calling end
- b: calling start
- b: calling end
- m: calling start
- m: calling end
- a: calling start
复制代码 在libfuc的最后一个usleep,这句注释掉的话,输出如下:- m: calling start
- m: calling end
- m: calling start
- m: calling end
- m: calling start
- m: calling end
- m: calling start
- m: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- m: calling start
- m: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- a: calling start
- a: calling end
- m: calling start
- m: calling end
- b: calling start
- b: calling end
- b: calling start
- b: calling end
- b: calling start
- b: calling end
- b: calling start
复制代码 这个在测试程序中很正常,因为解锁以后,系统不一定会进行线程(进程)切换,即使别的线程(进程)已经等待在该锁上,而解锁后立刻又去加锁,此时该锁处于解锁状态,自然又被自己获得了,加入usleep会强制让出CPU,其他等待该锁的线程(进程)获得该锁的几率会大一些,不过同样,即使这样,也有可能:m让出后a获得锁,a让出后m获得锁,如此循环,b很难获得锁,除非自己再加入加锁的排队调度算法。 |
|