C基础 如何让代码只实行同样蹩脚

1.0 最简便, 最高效的方式


    C 代码运行起点 main 就是个大单例函数. 如果把函数注册在其里面, 那么一定很可以 :)

// 某个库需要初始化的函数
void log_init(void) {
    ... ... 
}

int main(int argc, char * argv[]) {
    ... ...
    extern void log_init(void);
    log_init()
    ... ...    
    return 0;
}

是不是, 很轻松的完成了初始化工作.
不妨赠送一个好用的宏, 用于处理这类事情

//
// EXTERN_RUN - 简单的声明, 并立即使用的宏
// ftest    : 需要执行的函数名称
// ...      : 可变参数, 保留
//
#define EXTERN_RUN(ftest, ...)  \
do {                            \
    extern void ftest();        \
    ftest (__VA_ARGS__);        \
} while(0)

用起来更简单, 可以插在代码的任何一处

EXTERN_RUN(log_run);

文/燚不语

3.0 跳了锁问题, 尝试原子操作


    先举个小例子 

#include <stdio.h>

static void _once(void) {
    static long _cnt;

    printf("_once _cnt = %ld\n", ++_cnt);
}

//
// run once 感受
//
int main(int argc, char * argv[]) {
    puts("run once 感受开始 ... ");

    {
        static int _done;
        if (__sync_bool_compare_and_swap(&_done, 0, 1)) {
            _once();
        }

        if (__sync_bool_compare_and_swap(&_done, 0, 1)) {
            _once();
        }
    }

    puts("run once 感受结束 ... ");
    return 0;
}

运行展示:

图片 1

这里通过 GCC 提供的 原子交换 __sync_bool_compare_and_swap 解决的. 

不妨继续赠送的封装宏, 来完成上面操作

#define ONCE_RUN(code) {                                    \
    static int _done;                                       \
    if (!_done) {                                           \
        if (__sync_bool_compare_and_swap(&_done, 0, 1)) {   \
            code                                            \
        }                                                   \
    }                                                       \
}

因为是原子操作, 没有锁那么重, 自然出了问题也不会引起死锁问题.  

当然有人说 pthread, __sync_xxx 都是和 GCC 绑定的, 那么 CL 能不能使用了. 当然也是可以的.

pthread 跨平台 –
https://github.com/wangzhione/structc/blob/master/structc/system/thread.h

atomic 跨平台 –
https://github.com/wangzhione/atomic/blob/master/atomic/atom.h

通过上面基础封装库支持, 用 C 写系统应用相关代码还是很好搞的.

举杯满达, 还会重复写几执代码

    有问题, 是肯定的. 欢迎指正, 更新是共同提高的过程.

老鼠容易大米 –
http://music.163.com/m/song?id=308789&userid=16529894

回头看看, 时间好快呀.  那些个一块补习, 为了玩的伙伴们, 二胎孩子都快上学了. 
哈哈. 
咱们一线秃头兵还在为了 穷 而冲锋陷阵 (°ー°〃)

津城暴走‖我们素昧平生,所幸欣喜相逢

2.0 多线程模式, 如何为起啊


    继续看下面例子 once.c 

#include <stdio.h>
#include <pthread.h>

static void _once(void) {
    static long _cnt;

    printf("_once _cnt = %ld\n", ++_cnt);
}

//
// pthread_once 感受
//
int main(int argc, char * argv[]) {
    pthread_once_t once = PTHREAD_ONCE_INIT;

    puts("pthread_once 感受开始 ... ");
    pthread_once(&once, _once);
    pthread_once(&once, _once);
    puts("pthread_once 感受结束 ... ");

    return 0;
}

gcc -g -Wall -o once.out once.c -lpthread

最终运行结果, 也是如我们所料那样

图片 2

pthread_once 实际开发中多用于初始化线程私有变量. 其内部实现加锁的.
不妨问个小问题, 如果需要你去实现 pthread_once 你会怎么分析呢 ? 

这个问题好解答也不好解答. 
核心亮点在于 pthread_once 运行的函数实体崩溃了. 多线程之间如何避免死锁. 
不妨参照下面 winds 上面 pthread_once 一位大佬的实现:

#include "pthread.h"
#include "implement.h"

/* [i_a] simple wrapper ensures correct calling convention for all */
static void PTW32_CDECL
ptw32_mcs_lock_cleanup(void *args)
{
    ptw32_mcs_local_node_t *node = (ptw32_mcs_local_node_t *)args;
    ptw32_mcs_lock_release(node);
}

int
pthread_once (pthread_once_t * once_control, void (PTW32_CDECL *init_routine) (void))
{
  if (once_control == NULL || init_routine == NULL)
    {
      return EINVAL;
    }

  if ((PTW32_INTERLOCKED_LONG)PTW32_FALSE ==
      (PTW32_INTERLOCKED_LONG)PTW32_INTERLOCKED_EXCHANGE_ADD_LONG((PTW32_INTERLOCKED_LONGPTR)&once_control->done,
                                                                  (PTW32_INTERLOCKED_LONG)0)) /* MBR fence */
    {
      ptw32_mcs_local_node_t node;

      ptw32_mcs_lock_acquire((ptw32_mcs_lock_t *)&once_control->lock, &node);

      if (!once_control->done)
    {

#if defined(PTW32_CONFIG_MSVC7)
#pragma inline_depth(0)
#endif

      pthread_cleanup_push(ptw32_mcs_lock_cleanup, &node);
      (*init_routine)();
      pthread_cleanup_pop(0);

#if defined(PTW32_CONFIG_MSVC7)
#pragma inline_depth()
#endif

      once_control->done = PTW32_TRUE;
    }

      ptw32_mcs_lock_release(&node);
    }

  return 0;

}               /* pthread_once */

核心是通过 pthread_cleanup_push 和  pthread_cleanup_pop 解决崩溃死锁问题.
当然还有一种思路, 可以解决上面问题. 不妨往下看.

发出无出那说话,你协调蜷缩在孤独的犄角,不知情世界之老,哪里是属于自己的家;

出没有起那一瞬,你肯将团结交出,托付给同样浩大陌生的总人口,却会得意外的惊喜和感动。

天大地大,天南海北聚一齐,绿色营就是家;

动来宿舍,走有校园,外面大的天地会于您再次解读人生的意思;

于是一整个夜,邂逅一栋城市,带在同头孤勇,我们来自天南海北,素昧平生,却以欣喜相逢。

有人说:在全球里,人同丁撞的几率是五千分之一;人跟人口相知的概率是两亿分之一;能和我们老偕老的概率是五十亿分之一.

啊有人说,这世界,大多数丁里面的机缘也便是一面之缘而已,所以,相遇的那么一刻必然要是珍视,拥抱一定要努力,分别时毫无说再见,要说珍重,因为您切莫晓得何时会是归期,不清楚再见是何夕。

绿色营,一个产生情绪的大家庭,这里的诸一个分子都喜爱环保,热爱公益,主动自愿的总好所能够啊咱负的家中献有好的奋力,哪怕只能算是得上是绵薄之力,可我们并未会放弃,都说星星之火,可以燎原,那咱们这微绿色营,也堪叫地之各级一个角留下触动。我们也的无是协调,我们若之未是私利,我们纪念的凡本,想的凡满生态系统,我们不但使自己拼命,还要将这些需要记住并身体力行努力践行的环保理念传播到阳光洒了的各个一样片土地。

风里,雨里,绿色营等您。

去期,归期,我们来日可期。

终,在2017年即将过结束之际,所有绿色的子能于此寒冷津夜相遇。

当时是一个寒风刺骨的冬日,落叶都随着寒风打在圈,却总不克安然落下,因为风太非常,离开了陶铸没彻底之叶子们为难立足,难以生存,只能当大风中管该摆放,惨惨戚戚;

可我们,不平等,我们是绿色营的种,我们来绿色营这块肥沃的土地来滋润,我们发大家一块相拥的暖,我们之间爱的火舌在熊熊燃烧,这瑟瑟寒风也开为咱让道,因为它们掌握,我们必然战胜它,去抱黎明!

可怜开心,机缘巧合下第一不善当筹委来参与并集体这次“津城暴走”的倒,本想说新来乍到,多多指教;转念一思念,谁还尚无几单率先次等,都这样大了,什么没经验了,还要什么可怕的,于是虽然忙忙碌碌在复习忙在考证依然在了筹备。

作为一个不规范的导游,路痴这种情形是匪存的,不过真正对印象不浓的地方得过眼云烟完全在脑海里没存储空间呀!

图片 3

天津的眼^O^

乃,明明已把路完全走过一一体的自家,在第一涂鸦登点时要拉动在大家每次迷路,信誓旦旦的游说为就边走,结果每次都要倒回头路……

旋即其中曲折就不过细说了,纸短情长,你们最难忘。接下来要开始放大家“黑照”了,毕竟是大抵夜拍的,看哪个最黑哈哈哈哈哈哈!

终于,一起准备妥当,在一天天底指望着迎来了期待已久的津城暴走活动。

11月25号,晚上十点交早六点!

咱一行六十差不多丁于天黑倒及天亮,见证了全津城之月份升日出同太空星星。

图片 4

集合地点

作为毛爷爷唯一亲自题词的庄园,现在早就变成了天津市民休闲散步跳广场舞的会师地了,而被它还特别之一点,是我们天南海北相遇于此处。

图片 5

天津外国语大学

先是站,天津外国语大学,五大路里最得意的学,天外是著名的影拍摄场地,主要是以该修建之突出。所有的盖且是红黄相间的欧式建筑,很抱“外国语“的仪态。不得不说上他之植物也是头号的得意,尤其是春,迎春花、碧桃花开的专门深!进去就是平等栽幸福的觉得。曾拍了《金粉世家》鹿晗演的《重返二十载》以及林俊杰同金沙的《被风吹了之夏天》等统统在这里取景。

图片 6

民园

图片 7

民园体育场夜景

此处是夜里之民园,民园体育场现在早就起一个第一体育赛事集结地改为了万众休闲晒暖享受在太巧的精选了,独特的欧式建筑,有格调的音乐餐吧,各大免税商店,高级娱乐会所,让这里变成了国际化聚集场所。

图片 8

国际大兴土木博览会

图片 9

五坦途下滴鸢尾组

这边是夜里酉时底五大路,具有“万国建筑博览会”美誉的五坦途在夜色撩人的这,更加销魂迷人。

给我们一同,一起沉醉,沉醉在及时疯狂傲冬风里。

图片 10

山诺舞

冻冬日里,大家一齐过支舞也许就算不见面这么冷静。

咱们错走走,我们右走走,我们走我们走我们走相同移动,左脚跟左脚交,转半圈,右脚跟右脚尖,换个新伴侣……

怎么惩罚,此刻都着迷,大半夜的节拍相同响起,还是经不住哼起来接着一块跳起来,这样虽可知拿你们所有人数滴手还带一布满哈哈!

图片 11

瓷房子

图片 12

这边是独到的瓷房子。瓷房子位于天津市和平区赤峰道72哀号,它是一模一样所举世无双的建造,它的前身是历经百年的法式老洋楼,它的现世是极尽奢华之“瓷美楼奇”。

拖欠建筑被众人叫:一所价值连城的“中国古瓷博物馆”。这座“瓷房子”是天津市赤峰道平等栋用几近宗古董装修而变成的法式洋楼,由瓷房主人张连志亲自设计。其设计精妙,构思独特,墙体包含在宋代拥有各个大名窑烧制的闻名天下的瓷器,各种粉瓷,彩瓷,青花瓷,琳琅满目,美不胜收。

图片 13

图片 14

尽美自拍

图片 15

超级小可爱^O^

冰冷冬夜里,大家齐声走当然也少不了拍照啦啦啦啦啦啦

图片 16

唯王府

双重于前头挪,我们到了五通路上绝无仅有一栋王府,这是清朝宦官总管小德张亲自设计之,后来叫清朝季世亲王买下,后叫庆王府,现在凡是私人高级会见所,里面有特色餐厅,是商务会议,高级休闲娱乐之选择。

图片 17

南瓜马车前之我们,过了十二点会不见面变身……

图片 18

野马知更鸟黑白对比……

图片 19

狰狞小天虾组合^O^

图片 20

野马组最萌色差→_→

图片 21

鸢尾组滴小可爱们极得意最精良啊哈哈哈^O^

图片 22

海河夜色

无意中,我们就于晚十点动及凌晨四点,稍不留神就假设运动了全程。

图片 23

永乐桥 天津底眼摩天轮

天津底眼(The Tientsin Eye),全称天津永乐桥摩天轮(The Yongle Bridge
Tientsin
Eye),跨海河连续河北区与红桥区,是同样所超过江建设、桥轮合一的摩天轮,兼具观光和通功能。

天津之眼是亚洲唯打在桥上的摩天轮,是天津的地标之一。

摩天轮直径也110米,轮外装挂48单360度过透明座舱,每个座舱可乘坐8只人,可同时供应384独人口旅游。摩天轱辘旋转一宏观所急需时吗28分钟,到达最高处时,周边景观一览无余,甚至能顾四周40公里以内的景致,被喻为“天津的眼”。

相传,如果带来在心爱的人口一头,在摩天轮达到最高点时用心的接吻对方的恋人,心跳会在那一刻达到顶点,接下会触发除了激素还有多沾满胺力比多等多重新冲动,一不小心就是一生……

写到此,鸢尾小姐姐突然就生出个毕业愿望,希望能在毕业前,能去为同一涂鸦最高轮→_→

(好像在幻想,开始说梦话了……)

咳咳,该严正了,昨天还有同伴和我说实在分开时专门舍不得,虽然素昧平生,可个别时不知为什么会产生想哭的扼腕,我抢安慰他说绝不感伤离别,我们尚见面再见的!

一定!一定!

当这短小八单钟头里,六十基本上只素昧平生之魂魄,在阴冷冬夜里,

在行进中认识好,

当履着放出自己,

历经都之任何一样给,

被见不过好之大团结。

列一样次从深夜届凌晨之上进,

总想于你年轻人的人命里养有印记。

从而一个夜,邂逅一栋美丽的市,收获珍藏一辈子之震动!

人生难得有同等不善冲动,难得出平等糟糕任性,希望你意想不到中遇到的绿色营,能叫您带最多的震动!

图片 24

弦月回,恰像你带笑眉眼。

山大水长,我们江湖再见;

素昧平生,你本身欣喜相逢!

发没发出那相同秒,刚入大学的而起来难以置信自己,怀疑人生,怀疑自己混日子的意思;