file lock and thread sync operations (I)
来源:互联网 发布:中商情报网 知乎 编辑:程序博客网 时间:2024/05/18 23:25
第一点,多线程,每个线程都open flock write,不必explicitly sync threads(mutex、rdlock等),每个线程操作锁的顺序内部有序,并且,如果文件以append方式打开,文件写入不会混乱,如果以trunc方式打开,则文件内容可能混乱(write offset的原因,引起覆盖)。
第二点,flock,是进程层面的锁(第一点可印证),同时,这个锁与kernel维护的open file table关联。可联想下process table -- open file table -- vnode/inode table。
第三点,只主线程中open,然后把fd传给各子线程,各线程通过explicit thread sync来操作共享的fd。这个方法也可行。与flock相比,哪个更好,待确认。
第二点,flock,是进程层面的锁(第一点可印证),同时,这个锁与kernel维护的open file table关联。可联想下process table -- open file table -- vnode/inode table。
第三点,只主线程中open,然后把fd传给各子线程,各线程通过explicit thread sync来操作共享的fd。这个方法也可行。与flock相比,哪个更好,待确认。
第四点,flock vs. lockf vs. flockfile。
#include <pthread.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/file.h>#ifndef MYNB# ifdef LOCK_NB# undef LOCK_NB# endif#define LOCK_NB 0#endif#ifdef __cplusplusextern "C" {#endif#if 0pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;#endifvoid *thr_fn(void *data){ pthread_t tid = pthread_self(); const char *fn = (const char *)data; int fd, len; char buf[32]; fprintf(stderr, "in thr... %lu\n", tid); // fd = open(fn, O_RDWR | O_CREAT | O_APPEND, 0666); fd = open(fn, O_RDWR | O_CREAT, 0666); if (fd == -1) { char errbuf[64]; strerror_r(errno, errbuf, sizeof(errbuf)); fprintf(stderr, "in thr %lu: %s\n", tid, errbuf); return (void *)-1; } fprintf(stderr, "in thr %lu fd: %d\n", tid, fd); if (flock(fd, LOCK_EX | LOCK_NB) == -1) { char errbuf[64]; close(fd); strerror_r(errno, errbuf, sizeof(errbuf)); fprintf(stderr, "in thr %lu: %s\n", tid, errbuf); return (void *)-1; } else { fprintf(stderr, "in thr %lu: flock OK\n", tid); } len = snprintf(buf, sizeof(buf), "%lu\n", tid); fprintf(stderr, "in thr %lu, to be written: %d\n", tid, len);#if 0 pthread_mutex_lock(&mutex);#endif len = write(fd, buf, len);#if 0 fsync(fd);#endif#if 0 pthread_mutex_unlock(&mutex);#endif fprintf(stderr, "in thr %lu, written: %d\n", tid, len); if (flock(fd, LOCK_UN | LOCK_NB) == -1) { char errbuf[64]; close(fd); strerror_r(errno, errbuf, sizeof(errbuf)); fprintf(stderr, "in thr %lu: %s\n", tid, errbuf); return (void *)-1; } else { fprintf(stderr, "in thr %lu: flock un\n", tid); } close(fd); fprintf(stderr, "leaving thr... %lu\n", tid); return (void *)0;}int main(void){ const char *fn = "./foo.txt"; pthread_t tid1, tid2, tid = pthread_self(); int fd, len; char buf[32]; pthread_create(&tid1, NULL, thr_fn, (void *)fn); fprintf(stderr, "main %lu\n", tid);#if 0 sleep(2);#endif // fd = open(fn, O_RDWR | O_CREAT | O_APPEND, 0666); fd = open(fn, O_RDWR | O_CREAT, 0666); if (fd == -1) { char errbuf[64]; strerror_r(errno, errbuf, sizeof(errbuf)); fprintf(stderr, "main: %s\n", errbuf); } fprintf(stderr, "main fd: %d\n", fd); if (flock(fd, LOCK_EX | LOCK_NB) == -1) { char errbuf[64]; close(fd); strerror_r(errno, errbuf, sizeof(errbuf)); fprintf(stderr, "main: %s\n", errbuf); } else { fprintf(stderr, "main: flock OK\n"); }#if 0 sleep(2);#endif pthread_create(&tid2, NULL, thr_fn, (void *)fn); len = snprintf(buf, sizeof(buf), "%lu\n", tid); fprintf(stderr, "main, to be written: %d\n", len);#if 0 pthread_mutex_lock(&mutex);#endif len = write(fd, buf, len);#if 0 fsync(fd);#endif#if 0 pthread_mutex_unlock(&mutex);#endif fprintf(stderr, "main, written: %d\n", len); if (flock(fd, LOCK_UN | LOCK_NB) == -1) { char errbuf[64]; close(fd); strerror_r(errno, errbuf, sizeof(errbuf)); fprintf(stderr, "main: %s\n", errbuf); } else { fprintf(stderr, "main: flock un\n"); } close(fd); pthread_join(tid1, NULL); pthread_join(tid2, NULL); fprintf(stderr, "leaving main...\n"); return 0;}#ifdef __cplusplus}#endif
0 0
- file lock and thread sync operations (I)
- Disk file operations I/O
- log file switch and log file sync
- Thread and File
- Thread State and the Global Interpreter Lock
- log file sync and log file parallel wait event
- Thread and Sync In C# (C#中的线程与同步)
- Thread Pool and Asynch I/O
- File Operations In Java
- Optimize file system operations
- basic file operations
- 02 File Operations
- Binary Tree Operations(I)
- Processing I/O Operations
- linux 奇淫巧计 Userspace I/O scheduling for multi-file operations
- cadence Resolve lock file and re-run netrev 解决
- File sync tools
- File Sync 扩展对象
- [Visual Studio & Xamarin] 开发架构(三)- 跨平台的MVVMCross与portable class library-Android
- 【破解】百资繁中输入法_V1.8.1
- Hadoop、Spark、HBase与Redis的适用性讨论
- HDU1074 - Doing Homework(状压DP)
- struts中的类型转换(2)
- file lock and thread sync operations (I)
- android 输入输出流小结(1)
- [算法]有趣算法合辑[1-10]
- JS获取浏览器类型、版本
- 快排模板
- 【并查集】POJ 1182 食物链
- uitableview 奇怪现象原因之一
- 复制数组
- IOS文字下划线(转)