我正在编写一个程序,它本质上是UNIX中“cp”命令的多线程版本。为此,我创建了输入/输出文件,并初始化了信号量(分配所需)以同步共享数据。这是我的主要代码:
int main(int argc, const char * argv[])
{
//input/output file descriptors
int fdIn, fdOut;
//open files with proper rights
fdIn = open(argv[1], O_RDONLY);
fdOut = open(argv[2], O_WRONLY| O_CREAT | O_TRUNC, 0666);
//create and initialize semaphores
semaphore_t *empty = nullptr,*full = nullptr;
semaphore_create(mach_task_self(), empty, SYNC_POLICY_FIFO, 2);
semaphore_create(mach_task_self(), full, SYNC_POLICY_FIFO, 0);
//create and initialize structs to pass args to threads
threadDataConsumer.fd = fdOut;
threadDataConsumer.empty = empty;
threadDataConsumer.full = full;
threadDataProducer.fd = fdIn;
threadDataProducer.empty = empty;
threadDataProducer.full = full;
pthread_t tid1, tid2;
//create a thread for the producer and consumer
pthread_create(&tid1, NULL, Producer, (void *)&threadDataProducer);
pthread_create(&tid2, NULL, Consumer, (void *)&threadDataConsumer);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
我相信这是我的问题所在,因为我甚至没有开始编写Producer和消费者线程。任何帮助表示赞赏。谢谢!
答案 0 :(得分:1)
semaphore_t *
的{{1}}参数用于返回值。也就是说,函数需要知道构建信号量对象的位置。您不能只传入正确类型的任何变量:阅读文档以了解它的用途。在你的情况下:
semaphore_create()
一般情况下,学习如何使用调试器,它将准确告诉您段错误发生在哪一行。
同时验证您的输入并检查您的返回值。还有其他地方可能会出现这种情况。