Articles of 信号量

共享内存使用信号量进行安全写入

下面的Server代码把一个string转换成共享内存variables。 客户端代码显示共享内存中可用的string。 完整的代码: 可在这个github链接 Server.c int main(int argc, char *argv[]) { /* code to create posix shared memory and posix named semaphore */ /* critical section start */ snprintf(shared_msg->content, MAX_MSG_LENGTH, "%s", argv[1]); /* critical section end */ } Client.c int main(int argc, char *argv[]) { /* code to open posix shared memory and posix named […]

在Linux中控制Semaphore队列中的出队顺序

我想要实现的代码,我想分配几个“优先号码”不同的线程。 一些线程可能在同一个信号上等待。 假设线程在信号量S上排队,另一个线程在信号量S上执行一个sem_post。一旦sem_post被执行,我想要在信号量S队列中具有最高“优先级号码”的线程获得对信号量的访问而不是任何其他线程。 据我所知,没有直接的方法来实现这一点,因为将被select访问的线程可以是队列中的任何一个元素(不一定是FIFO等)。 事实上,我试图增加线程的pthread优先级,但我意识到它也不工作。 有人可以指导我如何实现这个devise,在C. Thankyou提前手动控制信号量队列。

while循环同步

我正在用一个用户定义的线程数,我正在使用7的项目。 我有一个while循环运行在每个线程,但我需要所有的线程在while循环结束时等待对方。 棘手的是,一些线程并不都是通过循环结束的次数。 void *entryFunc(void *param) { int *i = (int *)param; int nextPrime; int p = latestPrime; while(latestPrime < testLim) { sem_wait(&sem); nextPrime = findNextPrime(latestPrime); if(nextPrime != -1) { latestPrime = nextPrime; p = latestPrime; } else { sem_post(&sem); break; } sem_post(&sem); if(p < 46341) { incrementNotPrimes(p); } /* sem_wait(&sem2); doneCount++; sem_post(&sem2); while(go != […]

我怎样才能makefile这个

我的程序包含sharedmemory.c sharedmemory.h semaphore.c semaphore.h sumprime.c ,现在我想在Linux中编译一个名为sumprime的可执行文件 sumprime.c代码调用一些在sharedmemory.h semaphore.h中声明并在sharedmemory.c实现的方法sumprime.c 我的makefile是这样的: HEADERFILES = semaphore.h sharedmemory.h SOURCEFILES = sumprime.c semaphore.c sharedmemory.c OBJFILES = sumprime.o semaphore.o sharedmemory.o DISTFILES = $(HEADERFILES) $(SOURCEFILES) Makefile DISTFOLDER = lab5 HANDIN = ${DISTFOLDER}.tar.bz2 DEST=sumprime CCFLAG= .PHONY: all clean pack all: $(DEST) $(DEST): sumprime.o gcc sumprime.o -o $(DEST) sumprime.o: $(HEADERFILES) $(SOURCEFILES) gcc -c $(HEADERFILES) $(SOURCEFILES) […]

两个过程之间的障碍

我想在两个进程之间创build一个屏障。 为此,我使用了两个信号量。 当进程1到达屏障时,它通过发布第一个信号量来告诉进程2。 处理2接收到信号后,发布第二个信号作为确认。 代码看起来像这样… PROC1: sem_post( &sem_sig ); sem_wait( &sem_ack ); PROC2: sem_wait( &sem_sig ); sem_post( &sem_ack ); 现在我的问题是,如果这个方法是最有效率的,还是有更好的技术来实现两个stream程之间的stream程层面的障碍?

在linux中使用命名pipe道和信号量

我一直试图让我的程序工作几个小时,而我只是不能找出我的代码有什么问题。 这是关于在使用pipe道的processessess之间传递一个variables。 每个进程增加M次。 当我使用共享内存时,该程序完美工作,但是当我将其更改为使用pipe道时,这是一个灾难。 创build或使用命名pipe道似乎没有工作,或者我想我只是做错了方式。 以下是源代码: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/mman.h> #include <unistd.h> #include <memory.h> #include <fcntl.h> #include <sys/stat.h> #define PIPE_NAME "MY_PIPE" #define N 5 #define M 10 struct sembuf operations; int semid; key_t key; int marker; void semWait(int semid, int sempos) { operations.sem_num = sempos; operations.sem_op = […]

生产者 – 消费者实施

我需要在我的项目中实施生产者 – 消费者问题。 N个消费者和M个生产者将被创build。 生产者将使用发布(v)调用来将v数据传递给消费者。 消费者将使用get_data(v)调用来获取数据副本v我真的不知道如何实现它。 请帮帮我。 我打算用C来实现它。 我将为消费者和生产者创造一个n过程。 如果一个生产者发布一个数据,其他生产者在所有的消费者得到它之前都不能这样做。 我将使用信号量和共享内存来交换数据。 我发现了一些类似的工作。 但它正在使用线程,但我需要过程。 我怎样才能改变这一点。 #include <pthread.h> #include <stdio.h> #include <semaphore.h> #define BUFF_SIZE 4 #define FULL 0 #define EMPTY 0 char buffer[BUFF_SIZE]; int nextIn = 0; int nextOut = 0; sem_t empty_sem_mutex; //producer semaphore sem_t full_sem_mutex; //consumer semaphore void Put(char item) { int value; sem_wait(&empty_sem_mutex); //get […]

在暂停()之前可能上下文切换导致错过信号?

考虑下面的代码: 过程A(随机时间点): void catch(){}; // empty handler. signal(SIGCHLD,&catch); // attach empty handler. doSomthing(); unlock_semaphore(0); pause(); 进程B(目前被信号量0阻塞) lock_semaphore(0) // Stuck here until process A unlock 0. doSomthing(); kill(Process A, SIGCHLD); 并考虑这一系列事件: (0)A:doSomthing (1)A:unlock <————— Content Switch from A to B. (2)B:lock (3)B:doSomthing (4)B:kill <————— The signal is handled here (Doing nothing). (5)A:pause() <————— Process A being […]

错误地写入同步进程的文件输出顺序?

我有以下问题。 我有两个正在与信号量同步的进程,这个想法是这样的: 进程1向txt文件写入内容 进程2写入一些txt文件 进程1写入testing文件 我已经包含了这个示例代码来演示这个问题: // semaphore names #define NAME1 "/s1" #define NAME2 "/s2" int main() { /* semaphores for process synchronization */ sem_t *sm1; sm1 = sem_open( NAME1, O_CREAT, 0666, 0); sem_t *sm2; sm2 = sem_open(NAME2, O_CREAT, 0666, 0); /* processes*/ int proc1; int proc2; /* file lock struct */ struct flock fl […]

使用命名和未命名的信号量

我已经在这篇文章中读过关于命名和未命名信号量的信息,其中指出了一个命名的信号量用于2个不相关的进程,而未命名的信号量用于2个相关的进程。 如果我的程序在相关和不相关的进程中都可以使用,那么对于这两种情况,我可以使用一个命名的信号量吗? 谢谢