我想使用单printf
打印数组元素。数组很小(例如最多10个元素),但每次我可能需要打印不同数量的第一个数组元素。
我知道我可以这样做:
count = how_many_first_elements_i_need_this_time();
printf("array elements: ");
for (i = 0; i < count; ++i)
printf("%d ", array[i]);
printf("\n");
但是,这可能导致交错输出由不同线程同时执行的几个printf
。
我可以编写巨大的开关来处理所有可能的情况,但它很难看。
还有其他建议吗?
答案 0 :(得分:7)
其中一个解决方案是使用sprintf
将所有输出收集到一个char缓冲区中,并仅打印整个字符串一次。
您可以动态分配缓冲区......
char *pcBuf;
int iLen = 0;
count = how_many_initial_elements_i_need_this_time();
printf("array elements: ");
pcBuf = malloc((count * MAX_SIZE_OF_NUM) + count +1); //+count is required for space, and 1 is required for NULL
for (i = 0; i < count; ++i)
iLen += sprintf(pcBuf+iLen, "%d ", array[i]);
printf("%s \n", pcBuf);
答案 1 :(得分:2)
printf()
没有格式说明符可以自动打印数组的多个元素(%s
除外,但是它会拉伸它)。
所以,你需要保持循环。
为了使每个线程的输出更具原子性(我不确定它是否保证每个printf()
真正原子)你可以在字符串缓冲区中构建输出,然后将其打印出来马上。
这样做的一种方法是在循环中使用sprintf()
:
char out[1024], *put = out;
for(i =0; i < count; ++i)
put += sprintf(put, "%d ", array[i]);
strcat(put, "\n"); /* Fast! */
printf(out);
当然,如果存在风险,可以将其调整为不缓冲溢出,但1,024个字符中的10个整数应该是非常安全的。
答案 2 :(得分:1)
您可以使用某种类型的线程同步(如果您使用pthread,则可以查看互斥锁)。然后,线程在输出循环之前获取一个锁,并在之后释放锁。
如果循环中有计算,这可能会导致性能问题,因为线程必须等待彼此。如果您只是输出一个数组,那么与sprintf解决方案相比,我认为没有任何性能劣势。