Articles of 信号量

当两个进程尝试访问信号量为0的关键部分时会发生什么?

在我的代码中,我做了以下初始化: struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE }; int initPipe() { if (!myPipe.init) { myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, […]

什么时候调用sem_unlink()?

我有点困惑的Linux API sem_unlink(),主要是什么时候或为什么要调用它。 我已经在Windows中使用了信号量多年。 在Windows中,一旦closures了命名信号量的最后一个句柄,系统就会删除底层的内核对象。 但是在Linux中,开发人员需要通过调用sem_unlink()来移除内核对象。 如果内核对象没有保存在/ dev / shm文件夹中。 我遇到的问题是,如果进程A调用sem_unlink()而进程Blocking了信号量,则立即破坏信号量,而当进程C出现时,进程B不再受信号量的“保护”。 更重要的是,这个手册页最令人困惑的是: “信号量名称立即被删除,一旦信号量打开的其他进程closures,信号量就会被破坏。 如果需要等待其他进程closures信号量,它如何立即销毁对象? 显然我不明白在Linux上正确使用信号量对象。 谢谢你的帮助。 下面是我用来testing这个的一些示例代码。 int main(void) { sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1); if(pSemaphore != SEM_FAILED) { if(sem_wait(pSemaphore) == 0) { // Perform "protected" operations here sem_post(pSemaphore); } sem_close(pSemaphore); sem_unlink("/MyName"); } return 0; }

ubuntu:sem_timedwait不醒(C)

我有3个进程需要同步。 进程之一做一些事情然后唤醒进程二,然后进入hibernate状态,然后执行一些事情,然后唤醒进程三,然后进入hibernate状态。 整个循环定时运行25hz(由于在我的“真实”应用程序中触发了两个进程之前,由外部同步进入到进程1)。 我使用sem_post触发(唤醒)每个进程,sem_timedwait()等待触发器。 这一切都成功地运行了几个小时。 然而,在一些随机的时间(通常在两到四个小时之后),其中一个进程在sem_timedwait()中开始超时,尽pipe我确信信号量是由sem_post()触发的。 为了certificate这一点,我甚至在超时之后立即使用sem_getvalue(),值为1,所以timedwait应该已经被触发了。 请看下面的代码: #include <stdio.h> #include <time.h> #include <string.h> #include <errno.h> #include <semaphore.h> sem_t trigger_sem1, trigger_sem2, trigger_sem3; // The main thread process. Called three times with a different num arg – 1, 2 or 3. void *thread(void *arg) { int num = (int) arg; sem_t *wait, *trigger; int val, retval; […]

删除Linux上的所有共享内存和信号量

如何在Ubuntu中使用单个命令删除所有未使用的信号量和共享内存?

进程间信号量有时不像预期的那样工作

我有以下C代码,其中以sm为前缀的variables由两个进程proc1和proc2共享。 因此信号量也是共享的。 这个代码被重复调用。 所以如果我说以前的价值,这意味着以前的迭代的价值。 我注意到在我的程序中, proc1有时会传递sem_wait(sem_f2l)而没有proc2执行sem_post(sem_f2l) 。 这我注意到,因为sm_value_proc1和sm_value_proc2应该在我的程序中具有相同的值,这也是由printfs用>>>确认的。 但是,使用<<<的printf有时会显示不同的值。 不同之处在于proc1打印了以前的sm_value_proc2值,因为proc1神秘地不会等待proc2发布sm_f2l 。 任何想法这里怎么了? // semaphores are initialized like this -> sem_init( sm_l2f, 1, 0 ); // Note that sm_l2f and sm_f2l are pointers to sem_t // sm_condition is assigned here by proc1 if ( is_proc1 ) { sem_post( sm_l2f ); // proc2_value should be updated by […]

sem_open()错误:“未定义的引用到sem_open()”在Linux上(Ubuntu 10.10)

所以我得到的错误:“未定义的引用sem_open()”即使我已经包括semaphore.h头。 所有我的pthread函数调用(互斥体,pthread_create等)都发生了同样的事情。 有什么想法吗? 我正在使用下面的命令来编译: g ++'/home/robin/Desktop/main.cpp'-o'/home/robin/Desktop/main.out' #include <iostream> using namespace std; #include <pthread.h> #include <semaphore.h> #include <fcntl.h> const char *serverControl = "/serverControl"; sem_t* semID; int main ( int argc, char *argv[] ) { //create semaphore used to control servers semID = sem_open(serverControl,O_CREAT,O_RDWR,0); return 0; }

将POSIX信号量的值增加1以上

我有这个要求,我必须增加一个POSIX信号量的值超过1。 显然,在POSIX规范中没有办法做到这一点。 没有类似于sem_getvalue()的sem_setvalue()。 我不想因为这个限制而回到System V信号量。 有没有其他办法可以做到这一点? 或者我将不得不去System V的方式? 我在GNU / Linux的C编程。 非常感谢提前。

如何在C中初始化二进制信号量

在手册页中,即使您将信号量初始化为一个值, sem_init(&mySem, 0, 1); 通过多次调用,它仍然可以递增到大于1的值 sem_post(&mySem); 但在这个代码示例中 ,评论似乎有不同的看法: sem_init(&mutex, 0, 1); /* initialize mutex to 1 – binary semaphore */ 是否有可能在C初始化一个严格的二进制信号量? 注意:在这种情况下这样做而不是使用互斥体的原因是sem_post和sem_wait可能被不同的线程调用。

C,如何在分叉进程上使用POSIX信号量?

我想叉多个进程,然后使用它们的信号量。 这是我试过的: sem_init(&sem, 1, 1); /* semaphore*, pshared, value */ . . . if(pid != 0){ /* parent process */ wait(NULL); /* wait all child processes */ printf("\nParent: All children have exited.\n"); . . /* cleanup semaphores */ sem_destroy(&sem); exit(0); } else{ /* child process */ sem_wait(&sem); /* P operation */ printf(" Child(%d) is in […]

ReleaseSemaphore不释放信号量

(简而言之,main()的WaitForSingleObject挂在下面的程序中)。 我正在尝试写一段代码来分派线程并等待它们在恢复之前完成。 而不是每次创造线程,这是昂贵的,我把他们睡觉。 主线程以CREATE_SUSPENDED状态创buildX个线程。 同步使用X作为MaximumCount的信号量完成。 信号量的计数器被置零,线程被调度。 他们在进入睡眠之前执行一些愚蠢的循环并调用ReleaseSemaphore。 然后,主线程使用WaitForSingleObject X来确保每个线程完成其工作并正在hibernate。 然后它循环,并再次做到这一切。 有时程序不会退出。 当我喙的程序,我可以看到WaitForSingleObject挂起。 这意味着线程的ReleaseSemaphore不起作用。 没有什么是printf'ed所以没有出错。 也许两个线程不应该在同一时间调用ReleaseSemaphore,但是这将使信号量的作用无效。 我只是不喜欢它… 其他解决scheme同步线程感激地接受! #define TRY 100 #define LOOP 100 HANDLE *ids; HANDLE semaphore; DWORD WINAPI Count(__in LPVOID lpParameter) { float x = 1.0f; while(1) { for (int i=1 ; i<LOOP ; i++) x = sqrt((float)i*x); while (ReleaseSemaphore(semaphore,1,NULL) == FALSE) printf(" ReleaseSemaphore […]