首页 > 多线程中使用mktime和setenv函数

多线程中使用mktime和setenv函数

在编写ATS插件的过程中,发现使用mktime会偶尔出现段错误, 经过网上调研,发现mktime等函数不是线程安全的, 于是编写下面的代码进行测试.

注意加锁和不加锁区别很大, 在mktime中使用多线程, 加上互斥锁就没有问题.

//gcc -g mktime_multithread.c -o mktime_multithread -lpthread -std=c99
//
#include 
#include 
#include 
#include 
#include 
#include pthread_mutex_t mutex;void* test_setenv(void *arg)
{char ac_name[1024] = {};for (int i = 0; i < 10000; i++){snprintf(ac_name, sizeof(ac_name), "stra_1_fe_filter_dt_other_hadoop_arg_%d", i);printf("setenv %s
",ac_name);pthread_mutex_lock(&mutex);setenv(ac_name," 1500",0);pthread_mutex_unlock(&mutex);}return NULL;
}void* test_mktime(void* arg){for (int i = 0; i < 10000; i++){/*测试非法日期会不会导致程序异常*/struct tm st_tm;memset(&st_tm,0,sizeof(st_tm));strptime("201506270828001","%Y%m%d%H%M",&st_tm);pthread_mutex_lock(&mutex);time_t st_time = mktime(&st_tm);pthread_mutex_unlock(&mutex);printf("time_t=%lu
",st_time);}return NULL;
}int main(int argc, char* argv[])
{pthread_mutex_init(&mutex,NULL);pthread_t pt[2] = {0};pthread_create(&pt[0], NULL, test_setenv, NULL);pthread_create(&pt[1], NULL, test_mktime, NULL);pthread_join(pt[0], NULL);pthread_join(pt[1], NULL);pthread_mutex_destroy(&mutex);return 0;
}

参考文献

[1].http://www.xuebuyuan.com/1824402.html

更多相关:

  • 有时候因为业务需要,对某些非线程函数,比如mktime,需要使用互斥锁,可以参照example/blacklist-1或者channel_stats里面的用法 首先插件顶部声明 static TSMutex sites_mutex; 在TSPluginInit()中初始化 sites_mutex = TSMutexCreate...

  • 文章目录描述成员函数总结 描述 头文件 使用 std::mutex 简介 mutex是一种多线程变成中的同步原语,它能够让共享数据不被多个线程同时访问,它不支持递归得对互斥对象上锁特点 用方线程从它成功调用 lock 或 try_lock 开始,到它调用 unlock 为止占有 mutex线...

  • 函数原型 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) 第一个参数为需要等待的条件,第二个参数为互斥锁 一般该函数和 int pthread_cond_signal(pthread_cond_t *cond);函数一同使用,用来唤醒在cond...

  • 在使用空时,习惯这么赋值  int *p = NULL;  编译器进行解释程序时,NULL会被直接解释成0,所以这里的参数根本就不是大家所想的NULL,参数已经被编译器偷偷换成了0,0是整数。  因此这面的问题就尴尬了 不好意思图片引用于网络中。 为啥呢不是this is the ptr function…这个。这就是C++中的...

  • var d= {a: 1,b: null,c: 3,d: undefined };Object.keys(d).forEach(k=>d[k]==null&&delete d[k]);//去掉值为null或undefined的对象属性//Object.keys(d).forEach(k=>(d[k]==null||d[k]==='')...

  • //ES6获取浏览器url跟参 public getUrlParam = a => (a = location.search.substr(1).match(new RegExp(`(^|&)${a}=([^&]*)(&|$)`)),a?a[2]:null);...

  • 文章目录1. 解决问题2. 应用场景3. 实现如下C++实现C语言实现4. 缺点 1. 解决问题 在简单工厂模式中,我们使用卖衣服进行举例,同一种工厂可以卖很多不同种类的衣服,工厂只是将衣服的生产过程进行了封装。 当我们增加衣服种类的时候,在简单工厂模式中需要修改工厂的代码,破坏了类的开闭原则(对扩展开发, 对修改关闭),...

  • 在服务端数据库的处理当中,涉及中文字符的结构体字段,需要转为Utf8后再存储到表项中。从数据库中取出包含中文字符的字段后,如果需要保存到char *类型的结构体成员中,需要转为Ansi后再保存。从数据库中取出类型数字的字段后,如果需要保存到int型的结构体成员中,需要调用atoi函数进行处理后再保存。 1 static char *...