【发布时间】:2017-05-14 22:03:20
【问题描述】:
我正在为我的操作系统课程做一个关于信号量和同步的练习(参见下面的粗体文本)。练习的文字是这样的:
Pthread 信号量和互斥锁
C 程序 gen_binary_numbers.c 在命令行接收一个整数 n,并使用递归生成并显示所有 n 位二进制数。将递归程序转换为并发程序,将递归过程替换为生成适当数量的显示二进制数的进程(以任何顺序)。
这是我的代码,实际上:
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
int num, r, c;
pthread_mutex_t mutex;
void *genBin(void *arg);
int main (int argc, char **argv) {
if (argc != 2) {
fprintf(stdout, "\nUSAGE: %s <n>\n\n", argv[0]);
exit(EXIT_FAILURE);
}
int i;
num = atoi(argv[1]);
c = num;
r = 2;
for (i=1; i<num; i++) {
r=r*2;
}
pthread_mutex_init(&mutex, NULL);
pthread_t* p;
p = malloc(r*sizeof(pthread_t));
for (i=0;i<r;i++) {
if (pthread_create(&p[i], NULL, genBin, &i)) {
fprintf(stderr, "Error creating thread.\n");
exit(EXIT_FAILURE);
}
}
pthread_exit(0);
}
void *genBin (void *arg) {
int x;
int i=0;
x = *((int*)arg);
pthread_mutex_lock(&mutex);
while (i<num) {
if(x!=0) {
fprintf(stdout, "%d", x%2);
}
else {
fprintf(stdout, "0");
}
i++;
x/=2;
}
fprintf(stdout, "\n");
pthread_mutex_unlock(&mutex);
pthread_exit(0);
}
我认为代码应该返回正确的解决方案,但有时输出没有返回正确的数字。
正确输出示例:
./genBin 3
100
101
010
110
001
011
111
000
错误输出示例(由于重复):
./genBin 3
110
110
110
001
011
111
111
000
我认为问题在于互斥锁和 printf 之间的同步。 是否有替代解决方案来避免混淆结果?
【问题讨论】:
-
问题陈述说你要创建多个进程,但是你的程序却创建了线程。这些不是一回事,虽然两者有相似的考虑,但细节有所不同。
-
另外,你对失败行为的性质有点模糊。错误输出的示例和错误原因的解释将是适当的。
-
你说得对,但我忘了告诉你,实验室的标题是Pthread semaphores and mutexes。所以,我认为我必须使用 pthreads。我会在文中更正。谢谢!
标签: c printf mutex semaphore binary-semaphore