Tengo el siguiente ejercicio:
Para llegar a un encuentro de desarrolladores de sistemas operativos, tienen que cruzar un río en balsa. Los desarrolladores podrían pelear entre sí, hay que cuidar que vayan con un balance adecuado.
En la balsa caben cuatro (y sólo cuatro) personas.  La balsa es demasiado ligera, y con menos de cuatro puede volcar. Al encuentro están invitados hackers (desarrolladores de Linux) y serfs (desarrolladores de Microsoft). Para evitar peleas, debe mantenerse un buen balance: No se debe permitir que aborden tres hackers y un serf, o tres serfs y un hacker. Pueden subir cuatro del mismo bando, o dos y dos. Hay sólo una balsa. No se preocupen por devolver la balsa (está programada para volver sola)
Para eso implementé el siguiente codigo en Jbaci, pero no funciona. Encuentra el error y arreglalo:
binarysem s_balsa = 0;
binarysem s_cola = 1;
int i = 1, hackers = -1, serfs = -1;

void balsa() {
	wait(s_balsa);
	cout << "Viaje " << i << endl;
    i = i + 1;
    signal(s_balsa);
}

void cola() {
        wait(s_cola);
        cout << "Numero hackers " << hackers << " Numero serfs " << serfs << endl;
        if (hackers >= 4) {
            signal(s_balsa);
            hackers = hackers - 4;
            cout << "Cuatro hackers cruzaron el río en la balsa." << endl;
        } else if (serfs >= 4) {
            signal(s_balsa);
            serfs = serfs - 4;
            cout << "Cuatro serfs cruzaron el río en la balsa." << endl;
        } else if (hackers >= 2) {
            if (serfs >= 2) {
                signal(s_balsa);
                hackers = hackers - 2;
                serfs = serfs - 2;
                cout << "Dos hackers y dos serfs cruzaron el río en la balsa." << endl;
            }
        } else {
            signal(s_cola);
        }  
    
}

void main() {
    cout << "Ingrese la cantidad de hackers: " << endl;
	cin >> hackers;
    cout << "Ingrese la cantidad de sefs: " << endl;
	cin >> serfs;

	cobegin {
        cola();
		balsa();
	}
	cout << "Fin." << endl;  
}