代码
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_t tid[2];
void* fun(void* ptr)
{
int i = *((int *) ptr);
int self_id;
self_id=pthread_self();
printf("Thread %u ",self_id);
printf("printing %d \n", i);
pthread_exit(NULL);
return NULL;
}
int main()
{
int i=0,j=1,k;
for(j=1;j<21;)
{
for(i=0;i<2;i++)
{
pthread_create(&tid[i],NULL,fun,&j);
sleep(1);
j++;
}
}
for(j=1;j<21;)
{
for(i=0;i<2;i++)
{
pthread_join(tid[i],NULL);
j++;
}
}
pthread_exit(NULL);
}
所以如果2个线程是t1和t2并且它们的线程id是1023和1024,那么输出应该是
Thread 1023 printing 1
Thread 1024 printing 2
Thread 1023 printing 3
Thread 1024 printing 4
and so on till printing 20
但我的代码输出是
Thread 1023 printing 1
Thread 1024 printing 2
Thread 1025 printing 3
Thread 1026 printing 4
and so on till printing 20
线程ID不是交替的。如何使线程id交替。
答案 0 :(得分:2)
下面:
for(j=1;j<21;)
{
for(i=0;i<2;i++)
{
pthread_create(&tid[i],NULL,fun,&j);
...
你创建了20 * 2个线程,这解释了你见证的线程数。
为了创建两个线程,您应该只创建两个线程,例如:
for(i=0;i<2;i++)
{
pthread_create(&tid[i],NULL,fun,&j);
...
即没有外环。此外,您必须修改fun()
以打印10次(因此2 * 10 = 20)。现在最棘手的部分是让第一个线程的fun()
与第二个线程同步,如果你真的需要定义输出消息的顺序。但是,这会导致并行化。
PS:#include <unistd.h>
需要sleep()
。
答案 1 :(得分:0)
从我可以理解的问题来看,你需要两个线程,交替打印1到20个。
首先,正如gsamaras指出的那样,你正在产生40个线程,因为外部循环迭代20次,而内部循环迭代2次。因此,你必须按照gsamaras的指示生成2个线程。
除此之外,如果要替换打印,则必须进行一些同步,否则在文件中打印的顺序(本例中为stdout)是未定义的。我建议使用条件变量在这种情况下在线程之间交替以实现您的目标。
如果您对POSIX线程或线程相对较新,我建议您仔细阅读:https://github.com/expressjs/express/issues/2495