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
展开
 我来答
262454893
2012-11-02 · TA获得超过131个赞
知道答主
回答量:169
采纳率:0%
帮助的人:115万
展开全部
问题在于你创建进程的参数&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
百度网友cdb4d1b
2012-11-19 · TA获得超过143个赞
知道小有建树答主
回答量:275
采纳率:45%
帮助的人:80万
展开全部
#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 加一 */
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
foong_79
2012-11-02 · TA获得超过731个赞
知道小有建树答主
回答量:424
采纳率:100%
帮助的人:479万
展开全部
首先创建线程这里传的参数不能传入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;
...
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式