2

我想使用 single 打印数组元素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不同线程同时执行的多个输出交错,我想。

我可以编写巨大的开关来处理所有可能的情况,但它很难看。

还有其他建议吗?

4

3 回答 3

8

解决方案之一是使用 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);
于 2013-07-04T09:46:37.280 回答
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 个整数应该是相当安全的。

于 2013-07-04T09:51:42.507 回答
1

您可以使用某种类型的线程同步(如果您使用 pthreads,您可能会查看互斥锁)。然后一个线程在输出循环之前获取一个锁并在之后释放锁。

如果循环中有计算,这可能会导致性能问题,因为线程必须相互等待。如果您只输出一个数组,与 sprintf 解决方案相比,我预计不会有任何性能劣势。

于 2013-07-04T10:16:56.600 回答