#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define EXIT_ON_NOT_ZERO(assignment, msg) if((assignment)!=0) { perror(msg); exit(EXIT_FAILURE); }
void* produce(void* args) {
return (void*) 1;
}
void* consume(void* args) {
return (void*) 1;
}
int main() {
pthread_t producer;
pthread_t consumer;
void* producerStatus;
void* consumerStatus;
EXIT_ON_NOT_ZERO(pthread_create(&producer, NULL, &produce, NULL), "Creating producer thread");
EXIT_ON_NOT_ZERO(pthread_create(&consumer, NULL, &consume, NULL), "Creating consumer thread");
EXIT_ON_NOT_ZERO(pthread_join(producer, &producerStatus), "Joining producer thread");
EXIT_ON_NOT_ZERO(pthread_join(consumer, &consumerStatus), "Joining consumer thread");
printf("Producer exited with status: %d\n", *(int*)producerStatus);
printf("Consumer exited with status: %d\n", *(int*)consumerStatus);
exit(EXIT_SUCCESS);
}
我不明白为什么我不能同时施放和取消引用。
代码在到达第一个SEGFAULT
时会导致printf
。
答案 0 :(得分:1)
您无法做到这一点,因为(void *) 1
会返回地址0x01
并且取消引用它很可能是未定义的行为。
也许,你想投出&#34; 地址&#34;至intptr_t
,根据标准完全有效。
答案 1 :(得分:0)
我按以下方式编写这种类型的代码(声明,分配,赋值和转换void *返回结果),而不是使用ommitNorm=true
。在您的示例中,它看起来有点像这样:
return (void*)1
终端输出:
void* produce(void* args) {
int *pret = calloc(1,sizeof(int));
*pret = 1;
return (void*) pret;
}
void* consume(void* args) {
int *cret = calloc(1,sizeof(int));
*cret = 1;
return (void*) cret;
}
希望这会有所帮助。否则,您会遇到由存储持续时间引起的 segfault 问题 - 正如之前评论中简要提到的那样。请务必仔细阅读有关POSIX线程编程的相关资料......