linux下C编程问题,线程
#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<ctype.h>#include<pth...
#include <stdio.h> #include <sys/types.h>#include <unistd.h> #include <ctype.h>#include <pthread.h> #define MAX_THREAD 3 /* 线程的个数 */unsigned long long main_counter, counter[MAX_THREAD]; /* unsigned long long是比long还长的整数 */void* thread_worker(void*); int main(int argc, char* argv[]){ int i, rtn, ch; pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放线程id*/ for (i=0; i<MAX_THREAD; i++) { /* 在这里填写代码,用pthread_create建一个普通的线程, 线程id存入pthread_id[i],线程执行函数是thread_worker 并i作为参数传递给线程 */ pthread_create(&pthread_id[i],NULL,thread_worker,&i); } do {/* 用户按一次回车执行下面的循环体一次。按q退出 */ unsigned long long sum = 0; /* 求所有线程的counter的和 */for (i=0; i<MAX_THREAD; i++) {/* 求所有counter的和 */ sum += counter[i]; printf("%llu\n ", counter[i]); } printf("%llu/%llu\n", main_counter, sum); } while ((ch = getchar()) != 'q'); return 0; } void* thread_worker(void* p) { int thread_num; /* 在这里填写代码,把main中的i的值传递给thread_num */ thread_num = *((int*)p); for(;;) { /* 无限循环 */ counter[thread_num]++; /* 本线程的counter加一 */ main_counter++; /* 主counter 加一 */ } }
这段程序运行结果有些怪,sum值为什么总是0 展开
这段程序运行结果有些怪,sum值为什么总是0 展开
3个回答
展开全部
问题在于你创建进程的参数&i.
这个i在线程启动的时候变掉了,不是你想的0,1,2了。
你把这个地方改一下就行了。
我刚测试通过的。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long还长的整数 */
void* thread_worker(void*);
int main(int argc, char* argv[])
{
int i, rtn, ch;
int abc[MAX_THREAD] = {0,1,2};
pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放线程id*/
for (i=0; i<MAX_THREAD; i++)
{
/* 在这里填写代码,用pthread_create建一个普通的线程,
线程id存入pthread_id[i],线程执行函数是thread_worker
并i作为参数传递给线程 */
pthread_create(&pthread_id[i],NULL,thread_worker,&abc[i]);
}
do {/* 用户按一次回车执行下面的循环体一次。按q退出 */
unsigned long long sum = 0;
/* 求所有线程的counter的和 */
for (i=0; i<MAX_THREAD; i++)
{/* 求所有counter的和 */
sum += counter[i];
printf("%llu\n ", counter[i]);
}
printf("%llu/%llu\n", main_counter, sum);
} while ((ch = getchar()) != 'q');
return 0;
}
void* thread_worker(void* p)
{
int thread_num;
/* 在这里填写代码,把main中的i的值传递给thread_num */
thread_num = *((int*)p);
for(;;)
{
/* 无限循环 */
counter[thread_num]++; /* 本线程的counter加一 */
main_counter++; /* 主counter 加一 */
}
}
测试:
[admin@njgxserver02 ~]$ ./a.out
0
0
0
0/0
146908616
89336044
16948553
110371624/253193213
243883474
136339926
32212603
174397763/412436003
350577402
190203183
48289704
238267135/589070289
q
这个i在线程启动的时候变掉了,不是你想的0,1,2了。
你把这个地方改一下就行了。
我刚测试通过的。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long还长的整数 */
void* thread_worker(void*);
int main(int argc, char* argv[])
{
int i, rtn, ch;
int abc[MAX_THREAD] = {0,1,2};
pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放线程id*/
for (i=0; i<MAX_THREAD; i++)
{
/* 在这里填写代码,用pthread_create建一个普通的线程,
线程id存入pthread_id[i],线程执行函数是thread_worker
并i作为参数传递给线程 */
pthread_create(&pthread_id[i],NULL,thread_worker,&abc[i]);
}
do {/* 用户按一次回车执行下面的循环体一次。按q退出 */
unsigned long long sum = 0;
/* 求所有线程的counter的和 */
for (i=0; i<MAX_THREAD; i++)
{/* 求所有counter的和 */
sum += counter[i];
printf("%llu\n ", counter[i]);
}
printf("%llu/%llu\n", main_counter, sum);
} while ((ch = getchar()) != 'q');
return 0;
}
void* thread_worker(void* p)
{
int thread_num;
/* 在这里填写代码,把main中的i的值传递给thread_num */
thread_num = *((int*)p);
for(;;)
{
/* 无限循环 */
counter[thread_num]++; /* 本线程的counter加一 */
main_counter++; /* 主counter 加一 */
}
}
测试:
[admin@njgxserver02 ~]$ ./a.out
0
0
0
0/0
146908616
89336044
16948553
110371624/253193213
243883474
136339926
32212603
174397763/412436003
350577402
190203183
48289704
238267135/589070289
q
展开全部
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long还长的整数 */
void* thread_worker(void*);
int main(int argc, char* argv[])
{
int i, rtn, ch;
int abc[MAX_THREAD] = {0,1,2};
pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放线程id*/
for (i=0; i<MAX_THREAD; i++)
{
/* 在这里填写代码,用pthread_create建一个普通的线程,
线程id存入pthread_id[i],线程执行函数是thread_worker
并i作为参数传递给线程 */
pthread_create(&pthread_id[i],NULL,thread_worker,(void*)i }
do {/* 用户按一次回车执行下面的循环体一次。按q退出 */
unsigned long long sum = 0;
/* 求所有线程的counter的和 */
for (i=0; i<MAX_THREAD; i++)
{/* 求所有counter的和 */
sum += counter[i];
printf("%llu\n ", counter[i]);
}
printf("%llu/%llu\n", main_counter, sum);
} while ((ch = getchar()) != 'q');
return 0;
}
void* thread_worker(void* p)
{
int thread_num;
/* 在这里填写代码,把main中的i的值传递给thread_num */
thread_num = (int)p;
for(;;)
{
/* 无限循环 */
counter[thread_num]++; /* 本线程的counter加一 */
main_counter++; /* 主counter 加一 */
}
}
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <pthread.h>
#define MAX_THREAD 3 /* 线程的个数 */
unsigned long long main_counter, counter[MAX_THREAD];
/* unsigned long long是比long还长的整数 */
void* thread_worker(void*);
int main(int argc, char* argv[])
{
int i, rtn, ch;
int abc[MAX_THREAD] = {0,1,2};
pthread_t pthread_id[MAX_THREAD] = {0}; /* 存放线程id*/
for (i=0; i<MAX_THREAD; i++)
{
/* 在这里填写代码,用pthread_create建一个普通的线程,
线程id存入pthread_id[i],线程执行函数是thread_worker
并i作为参数传递给线程 */
pthread_create(&pthread_id[i],NULL,thread_worker,(void*)i }
do {/* 用户按一次回车执行下面的循环体一次。按q退出 */
unsigned long long sum = 0;
/* 求所有线程的counter的和 */
for (i=0; i<MAX_THREAD; i++)
{/* 求所有counter的和 */
sum += counter[i];
printf("%llu\n ", counter[i]);
}
printf("%llu/%llu\n", main_counter, sum);
} while ((ch = getchar()) != 'q');
return 0;
}
void* thread_worker(void* p)
{
int thread_num;
/* 在这里填写代码,把main中的i的值传递给thread_num */
thread_num = (int)p;
for(;;)
{
/* 无限循环 */
counter[thread_num]++; /* 本线程的counter加一 */
main_counter++; /* 主counter 加一 */
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先创建线程这里传的参数不能传入i地址,要知道线程启动需要点时间,到线程启动是,i早已经是3了,因为循环很快就执行完毕:
pthread_create(&pthread_id[i],NULL,thread_worker,(void *)i);
然后就在这里改改输入参数
void* thread_worker(void* p)
{
long thread_num; //32位编译用Int, 64位编译用long
thread_num = (long)p;
...
pthread_create(&pthread_id[i],NULL,thread_worker,(void *)i);
然后就在这里改改输入参数
void* thread_worker(void* p)
{
long thread_num; //32位编译用Int, 64位编译用long
thread_num = (long)p;
...
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询