জি ++ দিয়ে মাল্টিথ্রিড কোড সংকলন


89

আমার কাছে এখন পর্যন্ত সবচেয়ে সহজ কোড রয়েছে:

#include <iostream>
#include <thread>

void worker()
{
    std::cout << "another thread";
}

int main()
{
    std::thread t(worker);
    std::cout << "main thread" << std::endl;
    t.join();
    return 0;
}

যদিও আমি এখনও এটি g++চালনার সাথে সংকলন করতে পারি না ।

আরো বিস্তারিত:

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

সংকলনের আদেশ:

$ g++ main.cpp -o main.out -pthread -std=c++11

চলমান:

$ ./main.out 
terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted
Aborted (core dumped)

এবং এখন আমি আটকে আছি। ইন্টারনেটের সাথে সম্পর্কিত প্রতিটি থ্রেডে এটি যুক্ত -pthreadকরার পরামর্শ দেওয়া হয়েছে যখন আমার কাছে এটি ইতিমধ্যে রয়েছে।

আমি কি ভুল করছি?

PS: এটি একেবারে নতুন উবুন্টু 13.10 ইনস্টলেশন। কেবল g++প্যাকেজ ইনস্টল করা হয়েছিল এবং গৌণ জিনিসগুলি chromiumইত্যাদি

পিপিএস:

$ ldd ./a.out 
linux-vdso.so.1 => (0x00007fff29fc1000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb85397d000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb853767000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb85339e000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb85309a000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fb853c96000)

পিপিপিএস: এর সাথে clang++(v3.2) এটি সংকলন করে জরিমানা করে

পিপিপিপিএস: বলছি, এটি লিনাক্সের অধীনে জিসিসিতে স্টাড :: থ্রেড ব্যবহার করার জন্য সঠিক লিঙ্ক বিকল্পগুলি কী?

পিপিপিপিএস:

$ dpkg --get-selections | grep 'libc.*dev'
libc-dev-bin                    install
libc6-dev:amd64                 install
libclang-common-dev             install
linux-libc-dev:amd64                install

এটি libpthread-2.17.soএকই ডিরেক্টরিতে একটি সিমিলিংক ।
zerkms

হ্যাঁ, এটি একটি সঠিক লিঙ্ক। এই আমার dir lrwxrwxrwx। 1 মূল মূল 18 সেপ্টেম্বর 20 20:52 libpthread.so.0 -> libpthread-2.16.so
জেসন এনোকস

@ জেসন এনোকস: এটি আমার পক্ষে কাজ করবে - আমি সম্মত, যদি আমি বগি
জিসিসি

হ্যাঁ, আপনার লাইব্রেরি সব একটু আমার চেয়ে নতুন আছেন: জিসিসি সংস্করণ 4.7.2 20121109 (রেড হ্যাট 4.7.2-8) (জিসিসি)
জেসন Enochs

@ জেসন এনোকস: হি। নিজের জন্য আমি ইতিমধ্যে "এটি একটি বাগ" উত্তর নিয়ে সন্তুষ্ট এবং সম্ভবত পুরোপুরি নিশ্চিত হয়ে আগামীকাল সম্ভবত এটি একটি পুরানো উবুন্টুতে চালানোর চেষ্টা করব
জার্কम्स

উত্তর:


75

উত্তরটি এসও সি ++ চ্যাটের এক ধরণের সদস্য দ্বারা সরবরাহ করা হয়েছিল ।

দেখে মনে হচ্ছে এই আচরণটি জিসিসিতে কোনও বাগের কারণে হয়েছে।

যে বাগ আলোচনার শেষ মন্তব্যে দেওয়া কার্যসংক্রান্ত করে কাজ এবং ইস্যু solves:

-Wl,--no-as-needed

8
আপনার মতো এসও এবং ছেলেরা ছাড়া আমি কী করব? তুমি আমাকে প্রচুর চুল টানতে বাঁচিয়েছ। ধন্যবাদ :) এটি যতটা অস্পষ্ট তা যেমন হয় (আমার পক্ষে কমপক্ষে)
বৃশ্চিকমেঘ

@ এসসিপিওডাওগ: আপনার মন্তব্যটি আমার সন্ধ্যা করেছে, ধন্যবাদ :-)
জার্কামস

4
-pthread -lpthread -Wl,--no-as-neededএই কাজটি পেতে আমাকে সমস্ত পতাকা যুক্ত করতে হয়েছিল।
প্যারাম্যাগনেটিক ক্রোস্যান্ট

34

যুক্ত করা -lpthreadআমার জন্য অভিন্ন সমস্যা স্থির করে:

 g++ -std=c++11 foo.cpp -lpthread -o foo

4
জ্যাপ, এটি অ্যাঞ্জার এবং সম্পূর্ণ যুক্তিসঙ্গত। "-ডাব্লুএল, - অ-প্রয়োজন হিসাবে" অদ্ভুত শোনায় এবং এটি আমার পক্ষেও কাজ করে না।
থেইসেন্ট

4
আপনি স্পষ্টভাবে প্রয়োজন -lpthread। আপনি পারে প্রয়োজন -pthread -Wl,--no-as-needed, কম্পাইলার সংস্করণ উপর নির্ভর করে। gcc-4.8.2 এর দরকার।
cdunn2001

12

আমার কিছুটা আরও উন্নত সংস্করণ রয়েছে (৪.৮.১ এর পরিবর্তে ৪.৮.৪) এবং আমি উপরের তিনটি উত্তর পরীক্ষা করেছি। আসলে:

-pthread একা কাজ করে:

g ++ -std = c ++ 11 -o main -ththth main.cpp

-Wl,--no-as-neededএকা কাজ করে না

-lpthreadএকা কাজ করে না

-Wl,--no-as-neededএবং -lpthread একসাথে কাজ:

g ++ -std = c ++ 11 -o main -Wl, - যেমন প্রয়োজন নেই মেইন cpp -pththread

আমার সংস্করণটি "জি ++ (উবুন্টু 4.8.4-2ubuntu1 ~ 14.04.1) 4.8.4"।


ঠিক আছে, সমাধানগুলি বিভিন্ন সংস্করণের জন্য সরবরাহ করা হয়েছিল এবং আমি নিশ্চিত করে দিতে পারি যে আমি এটি যাচাই করেছি সেই মুহুর্তে পরীক্ষিত উত্তরটি কাজ করেছে। যাইহোক, প্রকৃত তথ্যের জন্য ধন্যবাদ।
zerkms

9

উত্তর ইতিমধ্যে Qtcreator জন্য তৈরি করা হয়েছিল:

LIBS += -pthread
QMAKE_CXXFLAGS += -pthread
QMAKE_CXXFLAGS += -std=c++11

কনসোল জি ++ এর জন্য: এখানে

g++ -c main.cpp -pthread -std=c++11         // generate target object file
g++ main.o -o main.out -pthread -std=c++11  // link to target binary

4
ধন্যবাদ, আপনার উত্তরটি কেবলমাত্র এটিই স্পষ্ট করে তোলে যে-পাঠ্যপথটি সংকলক এবং লিঙ্কারের কাছে প্রেরণ করতে হবে।
ডেনিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.