0

学校では、共有バッファーを回避する 2 つの読み取りスレッドと 1 つの書き込みスレッドを実行するプロジェクトに取り組んでいます。この共有バッファは、私たちが自分でプログラムしたある種のポインタ ベースのリストです。スレッドセーフにするために、pthread_rw_locks といくつかの pthread_barriers を使用しました。コードを実行しようとすると、ほぼ瞬時にクラッシュし、セグメンテーション エラーが発生しました。gdb デバッガーを使用すると、次のメッセージが表示されました。

プログラムが信号 SIGSEGV、セグメンテーション違反を受信しました。

__pthread_barrier_init (barrier=0x0, attr=0x0, count=2) at pthread_barrier_init.c:47

47 pthread_barrier_init.c: そのようなファイルまたはディレクトリはありません。

コンパイル時に -lpthread フラグを含め、それが使用されるすべてのファイルに pthread.h を含めるようにしました。私のプログラムがこのcファイルを見つけられない理由は何ですか?

編集

これは私が使用するコードのスニペットです。(これはほとんどすべてのコードですが、この部分で問題が発生します)

これはメインループの私のコードです

int main(int argc, char*argv[])
{
    sbuffer_t* buffer;
    sbuffer_init(&buffer);
        return 0;
}

これはバッファの私のコードです

/**
 * basic node for the buffer, these nodes are linked together to create the buffer
 */
typedef struct sbuffer_node {
    struct sbuffer_node *next;  /**< a pointer to the next node*/
    sensor_data_t data;         /**< a structure containing the data */
} sbuffer_node_t;

/**
 * a structure to keep track of the buffer
 */
struct sbuffer {
    sbuffer_node_t *head;       /**< a pointer to the first node in the buffer */
    sbuffer_node_t *tail;       /**< a pointer to the last node in the buffer */
    pthread_rwlock_t* lock; 
    pthread_barrier_t* barrierRead; //Barrier to indicate that both reader threads have succesfully read the sensor reading
    pthread_barrier_t* barrierWrite; //Barrier to indicate that a sensor reading has been removed
    pthread_mutex_t* FIFOlock;
    int finished;
};

int sbuffer_init(sbuffer_t **buffer) {
    (*buffer) = malloc(sizeof(sbuffer_t));
    (*buffer)->lock=malloc(sizeof(pthread_rwlock_t));
    if (*buffer == NULL) return SBUFFER_FAILURE;
    pthread_rwlock_init((*buffer)->lock,NULL);
    pthread_rwlock_wrlock((*buffer)->lock); 
    pthread_barrier_init((*buffer)->barrierRead, NULL, READER_THREADS);
    pthread_barrier_init((*buffer)->barrierWrite, NULL, READER_THREADS);
    pthread_mutex_init((*buffer)->FIFOlock, NULL);
    (*buffer)->head = NULL;
    (*buffer)->tail = NULL;
    (*buffer)->finished = CONNMGR_NOT_FINISHED;
    pthread_rwlock_unlock((*buffer)->lock);
    return SBUFFER_SUCCESS;
}
4

1 に答える 1

1

エラーはエラーではなく単なる警告であり、プログラムではなくデバッガーによって発行されます。デバッガーは、クラッシュが発生したソース ファイルを表示することで、ユーザーを支援しようとしました。残念ながら、そのソース ファイルはプログラムの一部ではなく、pthreads ライブラリの一部です。利用できないため、デバッガーはこの事実を通知します。そうしないと、問題が発生したソース行が表示されることが予想されるからです。gdb には、シグナル/例外が発生した後に呼び出される「ソース行の表示」関数があり、その関数は常に何か (ソース行または警告メッセージ) を出力します。

于 2022-01-04T16:19:59.757 に答える