Tag: 信号量

餐饮哲学家饥饿的可能性

如果它保证满足以下所有条件,我需要检查我解决餐饮哲学家问题的算法: 没有僵局的可能性。 没有饥饿的可能性。 我在筷子上使用信号量来解决问题。 这是我的代码(算法): while(true) { // He is Hungry pickup_chopsticks(i); // He is Eating… drop_chopsticks(i); // He is thinking } // … void pickup_chopsticks(int i) { if(i % 2 == 0) /* Even number: Left, then right */ { semaphore_wait(chopstick[(i+1) % NUM_PHILOSOPHERS]); semaphore_wait(chopstick[i]); } else /* Odd number: Right, then left */ { […]

共享内存中进程间的障碍实现

我正在寻找一个进程间障碍实现。 进程在共享内存中(即在同一个ndoe上)。 进程是MPI进程。 我不想使用MPI_Barrier函数,因为所有MPI实现的一般策略都是主动等待。 只要他们等待,我希望我的进程保持睡眠状态。 限制: 应该在C中,也许在C ++中 没有自旋锁,所以它可以使用信号量 linux OS 我相信它存在数千个屏障实现,但我没有找到任何?! 谢谢

如何读取/写入匿名共享映射?

尝试使用子进程将消息写入匿名共享内存,然后终止它。 然后让父母读取消息。 我已经看到了使用通过write调用获得的文件描述符来映射输入和输出文件的示例。 但不知道如何正确处理这个问题。 int main(void) { char *shared; int status; pid_t child; shared = mmap(0, sizeof(int) , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if (shared == MAP_FAILED) { perror(“mmap”); return 1; } child = fork(); if ( child == -1 ) { perror(“fork”); return 1; } else if (child == 0) { […]

POSIX信号量和pthread问题

我正在使用POSIX库练习信号量。 我试图通过一个信号量(代表一个服务器)传递线程(代表客户),这个信号量位于两个表(每个由sempahores控制)下的8个人。 我认为罪魁祸首是解锁和锁定多个信号量的顺序,但我似乎无法针对非法指令(核心转储)错误的来源。 EDITED – 互斥初始化的反向顺序和创建线程循环 – 添加返回NULL到eat()的结尾: #include #include #include #include sem_t server_sem; int server_pshared; int server_ret; int server_count = 10; sem_t tablea_sem; int tablea_pshared; int tablea_ret; int tablea_count = 4; sem_t tableb_sem; int tableb_pshared; int tableb_ret; int tableb_count = 4; //server_ret = serm_open(“serverSem”, O_CREAT | O_EXCL, 0644, server_count); int customer_count = 10; pthread_t […]

如何使用信号量同步进程

假设我有3个进程,包括父进程,我必须按照P3,P1,P2的顺序执行I程序。 伙计们,请帮助我如何从流程P3开始计算。 我需要输出为{0,1,2,3,4,5,.. max} 作为参考我的代码快照是: – #define SEM_NAME “//test.mutex” //#define SEM_NAME2 “//test2.mutex” int main(int argc, char const *argv[]) { int max = 0, i =0; sem_t *sem; sem_t *sem2; pid_t pid, pid2; sem = sem_open(SEM_NAME, O_CREAT, O_RDWR, 1); sem_unlink(SEM_NAME); if (sem==SEM_FAILED) { printf(“%s sem_open failed!”, SEM_NAME); return (-1); } // sem2 = sem_open(SEM_NAME2, O_CREAT, O_RDWR, […]

Pthread同步:两个文本文件的返回和读取

我正在编写一个创建两个线程的程序。 每个线程负责读取一个文本文件,每行有一个字符。 第一种格式如下: h 0 h 0 … 第二个格式如下: 0 i 0 i 0 i 有时可能会有多个字母在彼此之后,或者在彼此之后有多个零。 但是,可以肯定的是,如果一个文件的一行上有一个字母,则第二个文件的相应行将为0,反之亦然。 线程应该继续将文件输入读入全局char数组,直到它们达到零。 此时,他们允许其他线程接管。 他们一直来回走,直到两个文件完全被读取。 在这一点上,当我跑步的时候,我得到的变化是:(1)很多h后跟很多我或(2)( 正确答案 )连续的hihihi流,或者(3)有时很多我跟着很多h。 所以,我知道我的同步方法已关闭。 这是我的一个线程的示例:(注意两个线程完全相同,除了正在打开的文件。) void *getMessage1() { FILE *studentOne = fopen(“Student1”, “r”); size_t howManyChars; char *placeHolderChars; int count = 1; while (count 0) { placeHolderChars[1] = ‘\0’; } strcat(message,placeHolderChars); } free(placeHolderChars); if(feof(studentOne)) { pthread_mutex_unlock(&lock); […]

sem_timedwait()pthreads-win32 errno用法

我在Win32应用程序上使用pthreads-win32作为线程。 我正在使用此处发布的第一个函数计算timespec。 对sem_timedwait()的调用似乎在等待指定的ts时间,但是每次完成时我都会得到以下消息: 等待信号量时出错:没有错误 我在这里检查了sem_timedwait.c的文件,它们指定了相同的errno值和返回值。 因此,我不知道为什么它会退出这个错误,并想知道原因。 #ifdef _WIN32 #define HAVE_STRUCT_TIMESPEC #endif // _WIN32 #include #include #include #include #include #include #include #include #include “include.h” // Platform includes #ifdef _WIN32 #include #include #else #include #include #include #include #include #include #endif // _WIN32 // … sem_init(&job_semaphore, 0, 0); // … // Set wait time relative to current time […]

sem_wait不能在基本代码中工作

用gcc编译。 我跑了这个,看看为什么我在其他程序中使用的信号量不能正常工作。 我只是错误地使用这些或者什么? 即使信号量应该停止执行并导致死锁,每次输出字符串,对吧? 这是代码: #include #include #include #define NUM_THREADS 5 void printHello(); int main(){ int i; pthread_t threads[NUM_THREADS]; sem_t sem1; sem_init(&sem1, 0, 0); sem_wait(&sem1); for(i = 0; i < NUM_THREADS; i++){ pthread_create(&threads[i], NULL, &printHello, NULL); } sem_destroy(&sem1); pthread_exit(NULL); return 0; } void printHello(){ printf("sem_wait failed\n"); } 当我试图掌握整个multithreading概念时,任何帮助都会受到高度赞赏。 谢谢!

运行信号量的意外输出

我正在尝试编写一个程序,它会分叉另一个进程并保持同步,这样第一个进程就不会开始第(i)次迭代,直到第二个进程完成第(i-1)次迭代。 这只能使用两个信号量吗? 这是我到目前为止: #include #include #include #include #include #include sem_t semA, semB,sem,m; int main(void) { int i; pid_t child_a, child_b,pid2,pid3; sem_init(&semA, 0, 1); sem_init(&semB, 0, 0); sem_init(&m, 0, 0); child_a = fork(); //wait(); if (child_a == 0) { // int j; pid2 =getpid(); for (i = 0; i < 5; ) { sem_wait(&semA); //sem_wait(&m); printf("child1: […]

Semaphore与multithreading中的条件变量?

问题 :我必须增加x1和x2变量,这应该由不同的线程完成,并且在两个变量的上一个增量都没有完成之前,不应该调用两个变量的下一个增量。 问题: x1 = 0; x2 = 0; x1++; and x2++; should run parallel on different threads and wait for printing. should print: x1 = 1 and x2 = 1 x1++; and x2++; should run parallel on different threads and wait for printing. should print: x1 = 2 and x2 = 2 x1++; and […]