标签: semaphore

使用 VxWorks 反转安全互斥体时为什么需要 SEM_PRIORITY_Q?

在 VxWorks 中,我使用 SEM_INVERSION_SAFE 选项创建互斥体,以防止优先级反转问题。
手册说我还必须使用 SEM_PRIORITY_Q 选项。这是为什么?

mutex semaphore vxworks

0
推荐指数
1
解决办法
2007
查看次数

C++ Macs OS X semaphore.h:“sem_open()”和“sem_wait()”出现问题

#include <semaphore.h>

sem_t* x;

int main () 
{
    x = sem_open("x", O_CREAT, 0, 0);;
    sem_wait(x); sem_wait(x); sem_wait(x);
    std::cout << "\ndone\n";
}
Run Code Online (Sandbox Code Playgroud)

这段代码甚至不应该通过第一个sem_wait(),但在我的系统上它到达了main(). 我读过的所有内容,例如这里这里,都说,虽然Mac OS X不支持sem_init(),但它确实支持sem_open()。然而,sem_open()按照上面的使用方法并没有解决问题。我运行的是 OS X 10.5.7。

c++ macos semaphore

0
推荐指数
1
解决办法
6644
查看次数

使用 POSIX 信号量的可重用屏障实现

需要一个创建 5 个 pthread 的解决方案。每个 pthread 执行一个函数,该函数涉及循环 10 次。在循环的每次迭代中,线程将 int 从 0 增加到 0.9*MAX_INT,然后打印迭代编号。确保 5 个线程中的每一个都在它们可以开始第 (i+1) 次迭代之前完成循环的第 i 次迭代(即所有线程在每次迭代结束时同步/会合)。我需要使用使用 POSIX 信号量实现的两阶段屏障来强制执行同步约束

我写了以下代码我正确吗?

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

int thread_count;

void* MyThread(void* rank);

int main()

{

  long thread;

   pthread_t* thread_handles;

   thread_count = 5;

   thread_handles = malloc (thread_count*sizeof(pthread_t));

   for (thread = 0; thread < thread_count; thread++)

       pthread_create(&thread_handles[thread],NULL,MyThread,(void*) thread);

   for (thread = 0; thread < thread_count; thread++)

       pthread_join(thread_handles[thread], NULL);

   free(thread_handles);

   return 0;

}

void* Hello(void* rank)

{

    long my_rank = (long) …
Run Code Online (Sandbox Code Playgroud)

c multithreading synchronization semaphore pthreads

0
推荐指数
1
解决办法
4393
查看次数

分叉后为每个孩子生成随机等待时间

我在这里有这个源代码,它有一个必需的随机数生成函数,称为randG(); 问题是当我分叉 5 个孩子并在每个孩子中调用该函数 5 次时,我得到了 5 次相同的数字。有没有办法解决这个问题?我需要每个数字都是单独的和具体的。谢谢!

source code:
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <stdlib.h>
#include <math.h>


int randG(int mean, int stddev) {
  double mu = 0.5 + (double) mean;
  double sigma = fabs((double) stddev);
  double f1 = sqrt(-2.0 * log((double) rand() / (double) RAND_MAX));
  double f2 = 2.0 * 3.14159265359 * (double) rand() / (double) RAND_MAX;
  if (rand() & (1 << …
Run Code Online (Sandbox Code Playgroud)

c random semaphore

0
推荐指数
1
解决办法
30
查看次数

有时我的二进制信号量没有等待正确的时间

有时它等待的时间不够长。我可能错过了一些简单的东西 - 但我找不到它。为什么等待函数有时会过早返回

#define SEMAPHORE_MAXWAIT   -1
#define SEMAPHORE_NOWAIT    0

// Type your code here, or load an example.
typedef struct binary_semaphore {
    pthread_mutex_t mutex;
    pthread_cond_t condvar;
    bool variable;
}binary_semaphore_t;


static struct timespec *timespec_addms(struct timespec *ts, unsigned ms)
{
    uint64_t nsec;
    if(ts)
    {
        ts -> tv_sec += ms / 1000;
        nsec = ts -> tv_nsec + (ms % 1000) * 1000000ULL;
        ts -> tv_sec += nsec / 1000000000ULL;
        ts -> tv_nsec = nsec % 1000000000ULL;
    }
    return ts;
}

static int …
Run Code Online (Sandbox Code Playgroud)

c mutex timeout semaphore pthreads

0
推荐指数
1
解决办法
56
查看次数

fork开始执行表单在哪里?

对于我之前关于分段错误的问题,我得到了非常有用的答案.谢谢那些已经回复的人.

#include<stdio.h>
main()
{
 printf("hello");
int pid = fork();
wait(NULL);
}
Run Code Online (Sandbox Code Playgroud)

输出:hellohello.

在此,子进程从头开始执行.如果我没有错,那么如果我把sem_open放在fork()之前程序是如何工作的(ref答案:prev questions)

我需要一个关于分段故障的清晰解释,这种故障偶尔发生而不是总是发生 为什么不总是...如果编码中有任何错误,那么它应该始终正确...?

c linux fork semaphore segmentation-fault

-1
推荐指数
1
解决办法
317
查看次数

为什么应用程序被信号量阻止?

我有以下功能,假设[CIImage]为了我的目的返回- 在tableView中显示照片的一些元数据.

func getCIImages() -> [CIImage] {
    var images = [CIImage]()
    let assets = PHAsset.fetchAssetsWithMediaType(.Image, options: nil)

    for i in 0..<assets.count {
        guard let asset = assets[i] as? PHAsset else {fatalError("Cannot cast as PHAsset")}  
        let semaphore = dispatch_semaphore_create(0)

        asset.requestContentEditingInputWithOptions(nil) { contentEditingInput, _ in
            //Get full image
            guard let url = contentEditingInput?.fullSizeImageURL else {return}
            guard let inputImage = CIImage(contentsOfURL: url) else {return}
            images.append(inputImage)
            dispatch_semaphore_signal(semaphore)
        }
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    }
    return images
}
Run Code Online (Sandbox Code Playgroud)

但它停留在信号量等待,并没有走得更远.我已经浏览了很多教程,但GCD的其他变种不起作用.我认为这是因为模拟器,我不知道,无法在真实设备上进行测试.请帮忙.

semaphore grand-central-dispatch ios swift phasset

-1
推荐指数
1
解决办法
367
查看次数

无法在锁中等待,如何确保不会从多个线程访问异步变量和方法?

我有以下代码:

public const int ThreadLimitMax = 128;
private static object setThreadLimitLock = new object();
private static SemaphoreSlim totalThreadLimiter = new SemaphoreSlim(ThreadLimit, ThreadLimitMax);
        
public static int ThreadLimit { get; private set; } = 128;

public static async Task SetThreadLimit(int max)
{
    if (max > ThreadLimitMax)
        throw new ArgumentOutOfRangeException(nameof(max), $"Cannot have more than {ThreadLimitMax} threads.");
    if (max < 1)
        throw new ArgumentOutOfRangeException(nameof(max), $"Cannot have less than 1 threads.");

    lock (setThreadLimitLock)
    {
        int difference = Math.Abs(ThreadLimit - max);
        if (max < ThreadLimit)
        { …
Run Code Online (Sandbox Code Playgroud)

c# multithreading semaphore locking thread-safety

-1
推荐指数
1
解决办法
46
查看次数

为什么我使用此代码会出现分段错误?

运行此代码时出现分段错误.我无法弄清楚为什么会这样 - 有人能看到可能的原因吗?(我已经获得并初始化了信号量的共享内存.)

我的代码:
   #include<stdlib.h>
   #include<sys/types.h>
   #include<sys/shm.h>
   #include<sys/ipc.h>
   #include<stdio.h>
   #include<sys/sem.h>

   union semun 
   {
   int val;
   struct semid_ds *buf;
   unsigned short *array;
   } arg;



  int main()
  {
  key_t semkey;
  int shmid,semid,nsem,sops;
  struct sembuf buf[1];

  char *ptrr,*shm,c,*s;

  semkey=ftok("/home/mawia/abc.c",'a');

  printf("entered into main of producer\n");
  if(semkey<0)
  {
   perror("ftok");
   exit(1);
  }

  shmid=shmget(semkey,30,0777);

  if(shmid<0)
  {
   printf("error");
   perror("shmget");
   exit(1);
  }

  shm=shmat(shmid,0,0);
  if(shm==(char *) -1)
  {
  perror("shm");
  exit(1);
  } 

  s=shm;
  semid=semget(semkey,1,0777);
 if(semid<0)
 {
  printf("error");
  perror("semget");
  exit(0);
 }

 ptrr=shm+1;
 *s='w';
 printf("going to check the value 0th semaphores\n");
 buf[0].sem_num=0;
 buf[0].sem_op=0; …
Run Code Online (Sandbox Code Playgroud)

c semaphore segmentation-fault

-3
推荐指数
1
解决办法
3153
查看次数

如何在C#中使用win32 API

如何将win32连接到C#并使用win32函数创建信号量,互斥量等.

c# winapi multithreading mutex semaphore

-3
推荐指数
1
解决办法
785
查看次数