学校では、共有バッファーを回避する 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;
}