cpu-miner.cを眺めてみる2
struct thr_info *thr; long flags; int i; rpc_user = strdup(""); rpc_pass = strdup(""); /* parse command line */ parse_cmdline(argc, argv); if (!opt_benchmark && !rpc_url) { fprintf(stderr, "%s: no URL supplied\n", argv[0]); show_usage_and_exit(1); } if (!rpc_userpass) { rpc_userpass = malloc(strlen(rpc_user) + strlen(rpc_pass) + 2); if (!rpc_userpass) return 1; sprintf(rpc_userpass, "%s:%s", rpc_user, rpc_pass); } pthread_mutex_init(&applog_lock, NULL); pthread_mutex_init(&stats_lock, NULL); pthread_mutex_init(&g_work_lock, NULL); pthread_mutex_init(&stratum.sock_lock, NULL); pthread_mutex_init(&stratum.work_lock, NULL); flags = !opt_benchmark && strncmp(rpc_url, "https:", 6) ? (CURL_GLOBAL_ALL & ~CURL_GLOBAL_SSL) : CURL_GLOBAL_ALL; if (curl_global_init(flags)) { applog(LOG_ERR, "CURL initialization failed"); return 1; }
まずは、コマンドライン引数をパースしています。
ベンチマークの場合や、urlのプロトコルによって処理を分けているようです。
#if defined(WIN32) SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); num_processors = sysinfo.dwNumberOfProcessors; #elif defined(_SC_NPROCESSORS_CONF) num_processors = sysconf(_SC_NPROCESSORS_CONF); #elif defined(CTL_HW) && defined(HW_NCPU) int req[] = { CTL_HW, HW_NCPU }; size_t len = sizeof(num_processors); sysctl(req, 2, &num_processors, &len, NULL, 0); #else num_processors = 1; #endif if (num_processors < 1) num_processors = 1; if (!opt_n_threads) opt_n_threads = num_processors;
次にCPUの数を求めています。
私のMBA 2011 13inchの場合は、デュアルコア4スレッドのため、
num_processors = 4 となります。
#ifdef HAVE_SYSLOG_H if (use_syslog) openlog("cpuminer", LOG_PID, LOG_USER); #endif
syslogに出力する場合はここで出力設定します。
/* init workio thread info */ work_thr_id = opt_n_threads; thr = &thr_info[work_thr_id]; thr->id = work_thr_id; thr->q = tq_new(); if (!thr->q) return 1;
workI/Oのスレッド情報を初期化します。
work_th_idにはスレッド数が入ります。
thr_info構造体は次の構造になっています。
struct thr_info { int id; pthread_t pth; struct thread_q *q; };
マルチスレッド処理用の初期化処理だと思っておけばいいかと。
/* start work I/O thread */ if (pthread_create(&thr->pth, NULL, workio_thread, thr)) { applog(LOG_ERR, "workio thread create failed"); return 1; }
そして、ここでスレッドが作成されます。
スレッドが作成されることによって、 workio_thread関数が呼び出されます。
つづく