1
int S1 = 0;
int S2 = 0;
int x = 0;
int run = 1;
void Producer(void) {
    while(run) {
    while (S1 == S2);
    x++;
    __sync_synchronize();
    S1 = S2;
    __sync_synchronize();
    }
}

void Consumer(void) {
    while(run) {
    while (S1 != S2);
    x--;
    __sync_synchronize();
    S1 = !S2;
    __sync_synchronize();
    }
}

void* Worker(void *func) {
    long func_id = (long)func & 0x1;
    printf("%s %d\n",__func__, (int)func_id);
    switch (func_id) {
    case 0:
    Producer();
    break;
    case 1:
    Consumer();
    break;
    }
    return NULL;
}

int main(int argc, char *argv[]) {
     pthread_t t[argc];
     pthread_attr_t at;
     cpu_set_t cpuset;
     int threads;
     int i;
    #define MAX_PROCESSORS 4 // Minimal processors is 2.
     threads = argc > 1 ? (( atoi(argv[1]) < 4) ? atoi(argv[1]): MAX_PROCESSORS ) : 1;
    
     
     for (i = 0;i < threads; i++){ 
        CPU_ZERO(&cpuset);
        CPU_SET(i, &cpuset);
        pthread_attr_init(&at);
        
        (&at, sizeof(cpuset), &cpuset);
        if (pthread_create(&t[i], &at , Worker, (void *) (long)i) ) {
        perror("pthread create 1 error\n"); }
     }
     
     do {
        sleep(1);
     } while(x < 0);
     
    run = 0;
    void *val;
    for(i = 0; i < threads; i++)
    pthread_join(t[i], &val);
    printf("x=%d\n", x);
}

質問: ex1.c (6.1) で、次のどのプロパティが達成されたか:

(1) 相互排除するが進歩しない

(2) 相互排除ではなく進歩

(3) 相互排除も進歩もしない

(4) 相互排除と進歩の両方

説明してください?

1.2

どの引数 (6.1) が正しく、どれが正しくないか:

(1) 常に終了します。スレッド = 2 またはスレッド <= 0 の場合

(2) 常にハングします。スレッド = 1 またはスレッド > 2

どんな助けでも大歓迎です

4

0 に答える 0