测试代码如下,注意链接的时候加上 -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回你了~
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。CMake 可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)