menuTicketing
close





Ticketing C/C++ লাইব্রেরি

GitHub

এখনো অফিসিয়াল vcpkg রেজিস্ট্রিতে নিবন্ধিত হয়নি — জমাদানের শর্তাবলি কঠোর এবং নিবন্ধন প্রক্রিয়া এখনও চলমান। আপাতত উপরের Github রিপো ক্লোন করে সোর্স থেকে বিল্ড করুন।

রিপোজিটরি

উদাহরণ

মৌলিক উদাহরণ

ব্লকিং C API। একটি সার্ভারে সংযুক্ত হয়ে একটি কী অর্জন করে সঙ্গে সঙ্গে ফেরত দেওয়া হয়।

c
#include "ticketing/ticketing.h"

const char* addrs[1] = {"127.0.0.1:5225"};
ticketing_broker* broker = ticketing_connect(addrs, 1);
ticketing_wait_ready(broker, 2000);

ticketing_ticket* ticket = NULL;
ticketing_result r = ticketing_acquire(broker, "key", 5, 30, &ticket);

bool held = false;
ticketing_release(ticket, &held);
ticketing_ticket_close(ticket);

printf("pass\n");
ticketing_broker_close(broker);

কনকারেন্সি উদাহরণ (ডিস্ট্রিবিউটেড লক)

একাধিক pthread অ্যাকাউন্ট-ভিত্তিক লক দিয়ে পারস্পরিক বর্জন বজায় রেখে জমা/উত্তোলন বারবার করলেও ব্যালেন্স সবসময় শুরুর মানে ফিরে আসে কিনা যাচাই করার উদাহরণ।

c
static void* transaction(void* arg) {
    op_t* op = (op_t*)arg;
    char key[32];
    snprintf(key, sizeof(key), "account-%d", op->account);

    ticketing_ticket* ticket = NULL;
    ticketing_result r = ticketing_acquire(g_broker, key, WAIT, LEASE, &ticket);
    if (r != TICKETING_OK) {
        fprintf(stderr, "account %d acquire failed: %s\n", op->account, ticketing_strerror(r));
        return NULL;
    }

    int64_t before = balances[op->account];
    sched_yield(); // 락을 쥔 동안만 안전한 임계 구역
    int64_t after = before + op->delta;
    balances[op->account] = after;

    ticketing_ticket_close(ticket); // 백그라운드 자동 반납

    const char* action = op->delta < 0 ? "withdraw" : "deposit";
    fprintf(stderr, "account %d %s $%" PRId64 " -> $%" PRId64 "\n", op->account, action, op->delta, after);
    return NULL;
}

সম্পূর্ণ উদাহরণ example_test.c, bank_example_test.c, bench_test.c-এ দেখুন।