作者:小白吃丸子 | 来源:互联网 | 2023-10-13 10:14
主要用的线程函数:
1.创建线程:
1
2
|
int pthread_create(pthread_t * thread , const pthread_attr_t *attr,
void *(*start_routine) ( void *), void *arg);
测试代码:代码来自百度 稍作修改
测试平台:ARM
|
#include
#include
#include
#include
#include
#include
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cOnd= PTHREAD_COND_INITIALIZER;
static int count = 0;
struct timeval tv1,tv2,tv3;
int timestamp1,timestamp2,timestamp3;
/*释放节点内存 */
static void cleanup_handler(void *arg)
{
printf("Cleanup handler of second thread.\n");
free(arg);
(void)pthread_mutex_unlock(&mtx);
}
static void *thread_func(void *arg)
{
int time_fun=0;
// pthread_cleanup_push(cleanup_handler, p);
gettimeofday(&tv3, NULL);
timestamp3 = tv3.tv_sec * 1000 * 1000 + tv3.tv_usec;
time_fun = timestamp3 - timestamp1;
printf("time_fun:%d\n",time_fun);
while (1)
{
pthread_mutex_lock(&mtx);
while (1)
{
pthread_cond_wait(&cond, &mtx);
printf("Got %d from front of queue\n",count);
}
pthread_mutex_unlock(&mtx); //临界区数据操作完毕,释放互斥锁
}
// pthread_cleanup_pop(0);
return 0;
}
int main(void)
{
int time_create=0;
pthread_t tid;
int i;
gettimeofday(&tv1, NULL);
timestamp1 = tv1.tv_sec * 1000 * 1000 + tv1.tv_usec;
pthread_create(&tid, NULL, thread_func, NULL);
gettimeofday(&tv2, NULL);
timestamp2 = tv2.tv_sec * 1000 * 1000 + tv2.tv_usec;
time_create = timestamp2 - timestamp1;
printf("time_create:%d\n",time_create);
//usleep(10000);
for (i = 0; i <10; i++)
{
pthread_mutex_lock(&mtx); //需要操作head这个临界资源,先加锁,
count = i;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mtx); //解锁
sleep(1);
}
printf("thread 1 wanna end the cancel thread 2.\n");
pthread_cancel(tid);
pthread_join(tid, NULL);
printf("All done -- exiting\n");
return 0;
}
测试1 注释掉: //usleep(10000);
执行结果:
测试2:取消 注释掉: usleep(10000);
执行结果:
现象分析:
pthread_create(&tid, NULL, thread_func, NULL);这个语句的执行时间在2000us 到5000us之间
而 正真线程创建到线程函数体的执行时间大于5000us
所以第一次主线程发送同步信号的时候,子线程还没有启动完成造成测试1的第一个同步信息丢失。