static mrb_value mrb_uv_barrier_init(mrb_state *mrb, mrb_value self) { mrb_int arg_count; uv_barrier_t* context = NULL; mrb_get_args(mrb, "i", &arg_count); context = (uv_barrier_t*)mrb_malloc(mrb, sizeof(uv_barrier_t)); mrb_uv_check_error(mrb, uv_barrier_init(context, arg_count)); DATA_PTR(self) = context; DATA_TYPE(self) = &barrier_type; return self; }
int main() { uv_thread_t threads[3]; int thread_nums[] = {1, 2, 1}; uv_barrier_init(&blocker, 4); shared_num = 0; uv_rwlock_init(&numlock); uv_thread_create(&threads[0], reader, &thread_nums[0]); uv_thread_create(&threads[1], reader, &thread_nums[1]); uv_thread_create(&threads[2], writer, &thread_nums[2]); uv_barrier_wait(&blocker); uv_barrier_destroy(&blocker); uv_rwlock_destroy(&numlock); return 0; }
static int Barrier_tp_init(Barrier *self, PyObject *args, PyObject *kwargs) { unsigned int count; UNUSED_ARG(kwargs); RAISE_IF_INITIALIZED(self, -1); if (!PyArg_ParseTuple(args, "I:__init__", &count)) { return -1; } if (uv_barrier_init(&self->uv_barrier, count)) { PyErr_SetString(PyExc_ThreadError, "Error initializing Barrier"); return -1; } self->initialized = True; return 0; }
// same as ./10-locks, but using try* functions when obtaining read and write locks // int main() { int r; const int count = 4; fprintf(stderr, "barrier: init\n"); uv_barrier_init(&blocker, count); shared_num = 0; // https://github.com/thlorenz/libuv-dox/blob/master/methods.md#rwlock fprintf(stderr, "rwlock: init\n"); r = uv_rwlock_init(&numlock); if (r) ERROR("rwlock_init", r); uv_thread_t threads[3]; int thread_nums[] = { 1, 2, 1 }; r = uv_thread_create(&threads[0], reader_entry, &thread_nums[0]); if (r) ERROR("thread_create", r); r = uv_thread_create(&threads[1], reader_entry, &thread_nums[1]); if (r) ERROR("thread_create", r); r = uv_thread_create(&threads[2], writer_entry, &thread_nums[2]); if (r) ERROR("thread_create", r); // https://github.com/thlorenz/libuv-dox/blob/master/methods.md#barrier fprintf(stderr, "barrier: wait\n"); uv_barrier_wait(&blocker); fprintf(stderr, "barrier: destroy\n"); uv_barrier_destroy(&blocker); fprintf(stderr, "rwlock: destroy\n"); uv_rwlock_destroy(&numlock); if (r) ERROR("rwlock_destroy", r); return 0; }