Tag: 锁定

如何检查文件是否被锁定?

我有以下代码,我想检查文件是否被锁定。 如果没有,那么我想写信给它。 我通过在两个终端上同时运行它来运行此代码但是我每次都在两个选项卡中都处于“锁定”状态,即使我没有锁定它。 代码如下: #include #include #include int main() { struct flock fl,fl2; int fd; fl.l_type = F_WRLCK; /* read/write lock */ fl.l_whence = SEEK_SET; /* beginning of file */ fl.l_start = 0; /* offset from l_whence */ fl.l_len = 0; /* length, 0 = to EOF */ fl.l_pid = getpid(); /* PID */ fd […]

我们需要在Peterson锁定x86的unlock()函数中使用mfence吗?

彼得森的锁码取自(德国)维基百科 : # define FALSE 0 # define TRUE 1 # define N 2 int turn; int interested[N]; void enter_region(int process) { int other; other = 1 – process; interested[process] = TRUE; turn = other; while (interested[other] == TRUE && turn == other) ; } void leave_region(int process) { interested[process] = FALSE; } 有人可以想到一个例子,在leave_region函数中没有mfence的情况下发生错误吗? 注意:我确信在enter_region函数中需要一个mfence。

全球变量的Linux计时器

我在互联网上找到了下面的代码,我试图理解Linux计时器是如何工作的,无论如何,正如你在下面看到的那样,counter1是全局var,如果while正在处理它并且计时器关闭并改变会发生什么counter1的值,我需要锁吗? // timertst1.c: Simple timer demo program. Use cross-gcc // Vers. 1.00 – 21.Oct. 2002 // kdwalter@t-online.de #include #include #include #include // This is a timer handler. int counter1 = 0; void timerHandler (int signum) { printf (“timerHandler: counter= %d\n”, counter1++); fflush (stdout); } // This is the one and only main function. int main […]

一起使用wait_event_interruptible和wake_up_all

对于涉及使用阻塞和锁定调度进程的类项目,我们应该使用两个内核函数: int wait_event_interruptible(wait_queue_head_t q, CONDITION); void wake_up_all(wait_queue_head_t *q); wait_event_interruptible的解释是: 阻止等待队列上的当前任务,直到CONDITION变为true。 这实际上是一个宏。 它重复计算CONDITION,它是C代码的一个片段,如foo == bar或function()> 3.一旦条件为真,wait_event_interruptible返回0.如果条件为false,则将当前任务添加到wait_queue_head_t列表与状态TASK_INTERRUPTIBLE; 当前进程将阻塞,直到调用wake_up_all(&q),然后它将重新检查CONDITION。 如果当前任务在CONDITION变为true之前收到信号,则宏返回-ERESTARTSYS。 而wake_up_all的解释是: 通过将状态设置为TASK_RUNNABLE来唤醒等待队列中的所有任务。 我很难弄清楚这些function究竟是如何工作的,以及如何将它们结合使用。 例如,何时检查CONDITION? wait_event_interruptible是否连续轮询,还是仅在调用wake_up_all时重新检查条件? 这个解释有点不清楚。 如果您可以举例说明如何将这些function结合使用,那将非常有用。

C中的非繁忙阻塞队列实现

我试图在C中实现一个队列,导致进程非忙等待,直到队列中有一个元素要消耗。 我尝试过两种不同的尝试来实现这一目标。 我遇到的第一个问题是,如果enqueue / dequeue操作有条件检查边界( if (q-> count == QUEUESIZE)),对sem_wait的调用将立即返回,因为没有其他进程获得锁定。 如果我将条件更改为while (q-> count == QUEUESIZE),我相信消费者进程将“忙等待”,直到生产者进程发布信号量,这不是我实现的目标,并通过测试,我发现消费者进程不会获得锁定并继续。 我认为我很接近,但我似乎无法弄清楚如何解决这些问题。 我考虑过添加条件变量或pthread_mutex,但是在添加额外的复杂性之前想要耗尽信号量选项。 #define QUEUESIZE 48 typedef struct { char q[QUEUESIZE+1][150]; int first; int last; int count; sem_t *lock; } Queue; init_queue(Queue *q, sem_t *l) { q->first = 0; q->last = QUEUESIZE-1; q->count = 0; q->lock = l; } enqueue(Queue *q, […]

如何提供一系列交错线程来表明代码中断并且不能提供完美的同步?

我知道下面的代码做了什么,我知道为什么它是一个破碎的同步代码,因为它只有一个条件变量,而我们需要两个,但我不知道如何提供一个交错线程序列,以显示它不起作用。 你能说明为什么这段代码不适用于一个例子吗? 1 cond_t cond = PTHREAD_COND_INITIALIZER; 2 mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;; 3 4 void *producer(void *arg) { 5 int i; 6 for (i = 0; i < loops; i++) { 7 Pthread_mutex_lock(&mutex); 8 while (count == 1) 9 Pthread_cond_wait(&cond, &mutex); 10 put(i); 11 Pthread_cond_signal(&cond); 12 Pthread_mutex_unlock(&mutex); 13 } 14 } 15 16 void *consumer(void *arg) { […]

用`fcntl`和`flock`锁定有什么区别?

我正在阅读几个小时,但无法理解这两个锁之间有什么区别 。 我唯一理解的是fcntl()锁提供了一个可以锁定特定字节的粒度锁,只有fcntl()支持NFS锁定。 据说差异在于它们的语义,它们在被dup()或fork()复制时如何表现,但我无法理解实践中的区别。 我的情况是我正在写一个基于fork()的服务器中的日志文件,其中每个分叉进程在发生某些事情时写入同一文件。 为什么我要使用flock() ,为什么我要使用fcntl()锁?

当只有一个线程写入共享变量时,是否需要锁定?

我有2个线程和一个共享的float全局。 一个线程只写入变量,而另一个线程只读取它,我是否需要锁定对此变量的访问? 换一种说法: volatile float x; void reader_thread() { while (1) { // Grab mutex here? float local_x = x; // Release mutex? do_stuff_with_value(local_x); } } void writer_thread() { while (1) { float local_x = get_new_value_from_somewhere(); // Grab mutex here? x = local_x; // Release mutex? } } 我主要担心的是float的加载或存储不是primefaces的,因此local_x中的reader_thread最终会出现虚假,部分更新的值。 这是一个有效的问题吗? 是否有另一种方法可以在没有互斥锁的情况下保证primefaces性? 使用sig_atomic_t作为共享变量是否可行,假设它有足够的位用于我的目的? 有问题的语言是使用pthreads的C.

没有“-std = c99”的大规模fprintf速度差异

我写过一部表现不佳的翻译,几周来我一直在挣扎。 在下面简单的bechmark #include int main() { int x; char buf[2048]; FILE *test = fopen(“test.out”, “wb”); setvbuf(test, buf, _IOFBF, sizeof buf); for(x=0;x<1024*1024; x++) fprintf(test, "%04d", x); fclose(test); return 0 } 我们看到以下结果 bash-3.1$ gcc -O2 -static test.c -o test bash-3.1$ time ./test real 0m0.334s user 0m0.015s sys 0m0.016s 正如您所看到的,在添加“-std = c99”标志的那一刻,性能崩溃了: bash-3.1$ gcc -O2 -static -std=c99 test.c […]

Peterson Lock算法的测试实现?

有谁知道Peterson的锁定算法在C中的良好/正确实现? 我似乎无法找到这个。 谢谢。