- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
您好,很抱歉发布了一大堆代码,但我对 C 代码还很陌生,基本上我正在做一项大学作业,我必须实现一个“pthread_barrier”,现在我理解了屏障的概念(或者至少我认为我这样做)但我只是不确定我应该把它放在哪里。作业状态:
“使用 pthread_barrier_init 和 pthread_barrier_wait 确保所有生产者/消费者线程同时开始生产/消费。”
顺便说一句,这是作业的额外学分部分
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define SIXTY_SECONDS 60000000
#define ONE_SECOND 1000000
#define RANGE 10
#define PERIOD 2
typedef struct {
int *carpark;
int capacity;
int occupied;
int nextin;
int nextout;
int cars_in;
int cars_out;
pthread_mutex_t lock;
pthread_cond_t space;
pthread_cond_t car;
pthread_barrier_t bar;
} cp_t;
/* Our producer threads will each execute this function */
static void *
producer(void *cp_in)
{
cp_t *cp;
unsigned int seed;
/* Convert what was passed in to a pointer to a bounded buffer */
cp = (cp_t *)cp_in;
/* Loop */
while (1) {
/* Sleep for up to 1s */
usleep(rand_r(&seed) % ONE_SECOND);
/* Acquire the lock */
pthread_mutex_lock(&cp->lock);
/* While full wait until there is room available */
while (cp->occupied == cp->capacity) {
pthread_cond_wait(&cp->car, &cp->lock);
}
/* Insert an item */
cp->carpark[cp->nextin] = rand_r(&seed) % RANGE;
/* Increment counters */
cp->occupied++;
cp->nextin++;
cp->nextin %= cp->capacity;
cp->cars_in++;
/* Someone may be waiting on data to become available */
pthread_cond_signal(&cp->space);
/* Release the lock */
pthread_mutex_unlock(&cp->lock);
}
return ((void *)NULL);
}
/* Our consumer threads will each execute this function */
static void *
consumer(void *cp_in)
{
cp_t *cp;
unsigned int seed;
/* Convert what was passed in to a pointer to a bounded buffer */
cp = (cp_t *)cp_in;
while (1) {
/* Sleep for up to 1s */
usleep(rand_r(&seed) % ONE_SECOND);
/* Acquire the lock */
pthread_mutex_lock(&cp->lock);
/* While empty wait until there is data available */
while (cp->occupied == 0) {
pthread_cond_wait(&cp->space, &cp->lock);
}
/* Increment counters */
cp->occupied--;
cp->nextout++;
cp->nextout %= cp->capacity;
cp->cars_out++;
/* Someone may be waiting on room to become available */
pthread_cond_signal(&cp->car);
/* Release the lock */
pthread_mutex_unlock(&cp->lock);
}
return ((void *)NULL);
}
/* Our monitor thread will each execute this function */
static void *
monitor(void *cp_in)
{
cp_t *cp;
/* Convert what was passed in to a pointer to a bounded buffer */
cp = (cp_t *)cp_in;
while (1) {
/* Pause */
sleep(PERIOD);
/* Acquire the lock */
pthread_mutex_lock(&cp->lock);
printf("Delta: %d\n", cp->cars_in - cp->cars_out);
/* Release the lock */
pthread_mutex_unlock(&cp->lock);
}
return ((void *)NULL);
}
/* Initialisation */
static int
init(cp_t *cp, int capacity)
{
/* Set up the bounded buffer internals */
cp->occupied = cp->nextin = cp->nextout = cp->cars_in = cp->cars_out = 0;
cp->capacity = capacity;
/* Initialise our data structure */
cp->carpark = (int *)malloc(cp->capacity * sizeof (*cp->carpark));
/* Check malloc succeeded */
if (cp->carpark == NULL) {
perror("malloc()");
exit(EXIT_FAILURE);
}
/* Initialise lock and condition variables */
pthread_mutex_init(&cp->lock, NULL);
pthread_cond_init(&cp->space, NULL);
pthread_cond_init(&cp->car, NULL);
/* Seed random number generator */
srand((unsigned int)getpid());
return (0);
}
int
main(int argc, char *argv[])
{
pthread_t p, c, m;
cp_t cp;
/* Check usage */
if (argc != 2) {
printf("Usage: %s buffer_size\n", argv[0]);
exit(EXIT_FAILURE);
}
/* Initialise */
init(&cp, atoi(argv[1]));
/* Create our threads */
pthread_create(&p, NULL, producer, (void *)&cp);
pthread_create(&p, NULL, producer, (void *)&cp);
pthread_create(&c, NULL, consumer, (void *)&cp);
pthread_create(&c, NULL, consumer, (void *)&cp);
pthread_create(&m, NULL, monitor, (void *)&cp);
/* Wait for our threads */
pthread_join(p, NULL);
pthread_join(p, NULL);
pthread_join(c, NULL);
pthread_join(c, NULL);
pthread_join(m, NULL);
return (0);
}
最佳答案
我可能会给你完整的答案,但我担心 Lasse V. Karlsen。所以我会给你提示。
bar
已经可以在您的 struct cp_t
中访问pthread_barrier_init
初始化它,就像您初始化互斥体一样。 count
与actors的数量存在对应关系。wait
在开始生产/消费之前。明白了吗?关于c - 如何使用 pthreads 屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7032728/
我有一个使用临界区的 Windows DLL(C 语言)。多次调用的特定例程需要在第一次调用时执行一些初始化代码,因此我使用了临界区。但是,由于它被调用了很多次,我试图避免每次调用时都进入该部分的开销
我想确保正确实现障碍。现在,每次调用 amStaticThreaded 时都会启动大量新线程。在我的主例程中,amStaticThreaded 之后的所有事情都只能由一个线程完成,但那部分速度非常快。
我想实现自定义 Java 屏障。我不想使用 CyclicBarrier class . 所以所有线程都在一个公共(public)点相遇。只有当所有线程都到达屏障时,线程才会继续。 我想使用 wait/
您好,很抱歉发布了一大堆代码,但我对 C 代码还很陌生,基本上我正在做一项大学作业,我必须实现一个“pthread_barrier”,现在我理解了屏障的概念(或者至少我认为我这样做)但我只是不确定我应
什么是boost:barrier,如何使用这种boost方法。你能不能给我一个清楚的例子,因为我找到了下面的例子: bool wait() { boost::mutex
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
所以这是代码: #pragma omp parallel private (myId) { set_affinity(); myId = omp_get_thread_num(); if
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
我正在尝试创建一个 C 代码来对具有多个线程的数组进行排序,因此我需要使用屏障来同步威胁 void sort(struct ThreadArguments* args){ struct
这些天我正在阅读有关内存栅栏和屏障的内容,作为同步多线程代码和避免代码重新排序的一种方法。 我通常在 Linux 操作系统下使用 C++ 进行开发,并且大量使用 boost 库,但我找不到任何与之相关
我正在编写一个 SMT 程序,并且正在尝试解决一个有趣的问题。 我需要所有函数一起退出,但是有些线程卡在障碍物上,即使我不希望它们这样做。 我的问题是:当我删除障碍时会发生什么?卡在屏障处的线程会释放
可能是我没有理解线程的屏障概念。但是我写了一段代码,我想了解它是否正确使用了 barrier。 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*-
我想编写可移植代码(Intel、ARM、PowerPC...)来解决一个经典问题的变体: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something
我有一个 n 的二维网格x n元素。在一次迭代中,我通过平均相邻元素的值来计算一个元素的值。即: for(int i=0;i
我是 MPI 新手,在尝试使用障碍时遇到了 fatal error 。我有一个简单的 for 循环,它以循环方式将索引分配给每个进程,紧随其后的是 MPI 屏障: mpi.cc #include #
我正在使用 gdrive和 gshell为了与我的 Google 帐户交互并下载文件,请获取他们的信息。 当我运行时:gdrive about或 gdown about ,我收到以下消息 Initia
运行以下代码时,2个启动线程将被CyclicBarrier *对象锁定,并无限等待第三个线程解锁 import java.util.concurrent.BrokenBarrierException;
我是一名优秀的程序员,十分优秀!