Hoofdcategorieën

Bekijk bericht in topic: [C++] Producer / Consumer wil maar niet lukken?

No time for love, doctor Jones
Berichten: 5.599
Reg. datum: 20 september 2001

Als ik het goed begrijp is usage juist de variabele die je moet synchronizen. Die logica moet binnen je semaphores staan. Je hoeft daar zelf niet op te checken, de semaphore empty houdt juist zelf bij of er nog lege slots zijn.

Ik heb toevallig net zelf een shared memeory producer consumer buffer geschreven. Mijn acquire-release ziet er zo uit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    Tacquire_write_slot(bool block = true) {
        if (block) {
            sem_empty.wait();
        } else if (!sem_empty.try_wait()) {
            return 0;
        }

        return &storage[write_index*slot_sz];
    }

    void release_write_slot() {
        advance(write_index);
        sem_full.post();
    }

    Tacquire_read_slot(bool block = true) {
        if (block) {
            sem_full.wait();
        } else if (!sem_full.try_wait()) {
            return 0;
        }

        return &storage[read_index*slot_sz];
    }

    void release_read_slot() {
        advance(read_index);
        sem_empty.post();
    }

(ik split die functies omdat ik slots uitgeef en dat gaat via een scoped locking object... ingewikkeld... Verder gebruik ik boost::interprocess semaphores) Je kan nu iets toevoegen op deze manier:
C++:
1
2
3
Tx = pcb->acquire_read_slot(true);
x = // my data
pcb->release_write_slot();

 

Bekijk bericht
Bericht:
Quote bericht:

VNU Media logo Powered by True

© 1998 - 2009 Tweakers.net - Alle rechten voorbehouden

Uitgever van: