我在上课的作业时遇到很多麻烦,任何帮助都将是很大的。我需要此代码来创建4个生产者线程,这些线程不断循环并将SIGUSR1或SIGUSR2发送到4个消费者线程。 2个仅响应SIGUSR1,2个仅响应SIGUSR2。信号正在由生产者发送,并由消费者接收,但是之后什么也没有发生,程序崩溃了。下面是程序,以及运行时GDB的输出。

  #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <signal.h>
#include <time.h>

#define NP  4
#define NC1 2
#define NC2 2
#define CNT 10

void handler1(int);
void handler2(int);

typedef struct {
    int sent;
    int received;
    int buf[1];
    int SIG1;
    int SIG2;
    sem_t con;
    sem_t prod;
} sbuf_t;

sbuf_t buff;
pthread_t threads[9];

void *producer() {
    srand(time(0));
    int s,i;
    while(1){

        sem_wait(&buff.prod);
        s=(rand()%2)+1;
        //printf("prod ready \n");
        if(s==1){
            buff.sent++;
            for(i=0;i<4;i++){
            pthread_kill(threads[i],SIGUSR1);}
        }
        else if(s==2){
            buff.sent++;
            for(i=0;i<4;i++){
            pthread_kill(threads[i],SIGUSR1);}
        }
        usleep(rand()%100000);
        sem_post(&buff.prod);
    }


}

void *consumer1() {
    signal(SIGUSR1, handler1);
    //printf("waiting 1\n");
    while(1){

    }
}

void *consumer2() {
    signal(SIGUSR2, handler2);
    //printf("waiting 2\n");
    while(1){

    }
}

void handler1(int signum){
    printf("Caught 1\n");
    if(signum==SIGUSR1){
        sem_wait(&buff.con);
        buff.received++;
        buff.SIG1++;

        sem_post(&buff.con);
    }
}

void handler2(int signum){
    printf("caught 2 \n");
    if(signum==SIGUSR2){
        sem_wait(&buff.con);
        buff.received++;
        buff.SIG2++;

        sem_post(&buff.con);
    }
}

void main(){
    buff.SIG1=0;
    buff.SIG2=0;
    buff.sent=0;
    buff.received=0;
    int index;


        sem_init(&buff.con, 0, 1);
    sem_init(&buff.prod, 0, 1);

        for (index = 0;index < NC1;index++) {
            pthread_create(&threads[index], NULL, consumer1,NULL);
        }
    for (index = 0;index < NC2;index++) {
            pthread_create(&threads[index+2], NULL, consumer2,NULL);
        }
    for (index = 0; index < NP; index++) {
            pthread_create(&threads[index+4], NULL, producer,NULL);
        }


和gdb

(gdb) run
Starting program: /home/eric/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff77f6700 (LWP 4944)]
[New Thread 0x7ffff6ff5700 (LWP 4945)]
[New Thread 0x7ffff67f4700 (LWP 4946)]
[New Thread 0x7ffff5ff3700 (LWP 4947)]
[New Thread 0x7ffff57f2700 (LWP 4948)]

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff5ff3700 (LWP 4947)]
consumer2 () at lab3.c:68
68      }
(gdb) continue
Continuing.

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff67f4700 (LWP 4946)]
consumer2 () at lab3.c:68
68      }
(gdb)
Continuing.

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff6ff5700 (LWP 4945)]
consumer1 () at lab3.c:60
60      }
(gdb)
Continuing.
[New Thread 0x7ffff4ff1700 (LWP 4949)]

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff77f6700 (LWP 4944)]
consumer1 () at lab3.c:60
60      }
(gdb)
Continuing.
Caught 1
Caught 1
Caught 1

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff5ff3700 (LWP 4947)]
consumer2 () at lab3.c:68
68      }
(gdb)
Continuing.
Caught 1
[New Thread 0x7ffff47f0700 (LWP 4950)]
Caught 1

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff67f4700 (LWP 4946)]
consumer2 () at lab3.c:68
68      }
(gdb)
Continuing.

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff6ff5700 (LWP 4945)]
consumer1 () at lab3.c:60
60      }
(gdb)
Continuing.
Caught 1

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff77f6700 (LWP 4944)]
consumer1 () at lab3.c:60
60      }
(gdb)
Continuing.
Caught 1
[New Thread 0x7ffff3fef700 (LWP 4951)]
Caught 1

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff5ff3700 (LWP 4947)]
consumer2 () at lab3.c:68
68      }
(gdb)
Continuing.

Program received signal SIGUSR1, User defined signal 1.
[Switching to Thread 0x7ffff67f4700 (LWP 4946)]
consumer2 () at lab3.c:68
68      }
(gdb)
Continuing.
Caught 1
[Thread 0x7ffff3fef700 (LWP 4951) exited]
[Thread 0x7ffff47f0700 (LWP 4950) exited]
[Thread 0x7ffff4ff1700 (LWP 4949) exited]
[Thread 0x7ffff57f2700 (LWP 4948) exited]
[Thread 0x7ffff5ff3700 (LWP 4947) exited]
[Thread 0x7ffff67f4700 (LWP 4946) exited]
[Thread 0x7ffff7fda740 (LWP 4940) exited]
Cannot find user-level thread for LWP 4945: generic error
(gdb)
Continuing.
Cannot execute this command without a live selected thread.
(gdb)

最佳答案

看看:sigemptyset,sigaddset也许可以帮助您

10-06 12:19