测试代码如下,注意链接的时候加上 -lpthread 这个参数
#include <stdio.h>
#include <errno.h>//perror()
#include <pthread.h>
#include <unistd.h>//sleep()
#include <time.h>// time()
#include <stdlib.h>//rand()
#define FD "conf.txt"
typedef void *(*fun)(void *)
struct my_struct
{
unsigned time_to_wait
int n
}
void *test_thread(struct my_struct *)
int main (int argc, char const *argv[])
{
FILE *fp = fopen(FD, "r")
if (fp == NULL)
{
perror(FD)
return -1
}
srand((unsigned)time(NULL))//初始化随机种子
int thread_count
fscanf(fp, "%d", &thread_count)
fclose(fp)
if (thread_count <= 0)
{
printf("线程数<1,退出程序。\n")
return -1
}
pthread_t *ptid = (pthread_t *)malloc(sizeof(pthread_t) * thread_count) //保存线程ID
int i
for (i = 0i <thread_counti++)
{
int tw = rand() % thread_count + 1//随机等待时间
struct my_struct * p = (struct my_struct *)malloc(sizeof(struct my_struct))
if (p == NULL)
{
perror("内存分配错误")
goto ERROR
}
p->time_to_wait = tw
p->n = i + 1
int rval = pthread_create(ptid + i, NULL, (fun) test_thread, (void *)(p))//注意这里的强制转换(两个)
if (rval != 0)
{
perror("Thread creation failed")
goto ERROR
}
//sleep(1) //这句加也可以,不加也可以。最开始的时候加上这个是为了让两个线程启动的时候之间有一定的时间差
}
printf("主线程启动\n\n")
fflush(stdout)
for (i = 0i <thread_counti++)
{
pthread_join(*(ptid + i), NULL)//等待所有线程退出。
}
printf("\n主线程退出\n")
ERROR:
free(ptid)
return 0
}
void *test_thread(struct my_struct * p) //线程启动的时候运行的函数
{
printf("第%d个线程启动,预计运行%d秒\n", p->n, p->time_to_wait)
fflush(stdout)
sleep(p->time_to_wait) //让线程等待一段时间
printf("第%d个线程结束\n", p->n)
fflush(stdout)
free(p)
return NULL
}
你的第二个问题我在百度HI回你了~
一、工具的使用1、学会使用vim/emacs,vim/emacs是linux下最常用的源码编辑具,不光要学会用它们编辑源码,还要学会用它们进行查找、定位、替换等。新手的话推荐使用vim,这也是我目前使用的文本编辑器。
2、学会makefile文件的编写规则,并结合使用工具aclocal、autoconf和automake生成makefile文件。
3、掌握gcc和gdb的基本用法。掌握gcc的用法对于构建一个软件包很有益处,当软件包包含的文件比较多的时候,你还能用gcc把它手动编译出来,你就会对软件包中各个文件间的依赖关系有一个清晰的了解。
4、掌握svn/cvs的基本用法。这是linux,也是开源社区最常用的版本管理系统。可以去试着参加sourceforge上的一些开源项目。
二、linux/unix系统调用与标准C库
系统调用应用软件与 *** 作系统的接口,其重要性自然不用说,一定要掌握。推荐学习资料为steven先生的UNIX环境高级编程(简称APUE)。
三、库的学习
无论是在哪个平台做软件开发,对于库的学习都很重要,linux下的开发库很多,我主要介绍一下我常常用到的一些库。
1、glib库
glib 库是gtk+和gnome的基础库,并具是跨平台的,在linux、unix和windows下都可以用。glib库对于linux平台开发的影响就像 MFC对windows平台开发的影响一样,很多开源项目都大量的使用了glib库,包括gimp、gnome、gaim、evolution和 linux下的集群软件heartbeat.因为glib库自带有基本的数据结构实现,所以在学习glib库的时候可以顺便学习一下基本的数据结构(包括链表、树、队列和hash表)。
2、libxml库
libxml是linux平台下解析XML文件的一个基础库,现在很多实用软件都用XML格式的配置文件,所以也有必要学习一下。
3、readline库
readline 库是bash shell用的库,如果要开发命令行程序,那么使用readline库可以减少很多工作量,比如bash里的命令行自动补全,在readline里就已经有实现,当然你也可以用自己的实现替代库的行为。readline库有很多网站介绍的,只要google一下readline就可以找到一堆了。
4、curses库
curses 库以前是vi程序的一部分,后来从vi里提取出来成为一个独立的库。curses库对于编写终端相关的程序特别有用,比如要在终端某一行某一列定位输出,改变终端字体的颜色和终端模式。linux下的curses库用的是GNU实现的ncurses(new curses的意思)。
5、gtk+和KDE库
这两个库是开发GUI应用程序的基础库,现在linux下的大部份GUI程序都是基于这两个库开发的,对于它们 的学习也是很有必要的。
四、网络的学习
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)