একই সকেটে পাঠানো / পুনর্বিবেচনার সমান্তরাল কলগুলি কি বৈধ?


127
  1. আমরা কি একই সকেটে একটি থ্রেড থেকে আর অন্যের কাছ থেকে পাঠানো কল করতে পারি?
  2. আমরা কি একই সকেটের বিভিন্ন থ্রেড থেকে সমান্তরালভাবে একাধিক প্রেরিকে কল করতে পারি?

আমি জানি যে একটি ভাল ডিজাইনের এড়াতে হবে, তবে এই সিস্টেমের এপিআইগুলি কীভাবে আচরণ করবে তা আমি পরিষ্কার নয়। আমি একই জন্য একটি ভাল ডকুমেন্টেশন সন্ধান করতে অক্ষম।

দিকের কোনও পয়েন্টার সহায়ক হবে helpful


3
আপনি কেন দাবি করেন যে এটি করা খারাপ অভ্যাস ?. আমার কাছে এটি দুর্দান্ত লাগছে কারণ আপনি বিভিন্ন থ্রেডে শুনতে এবং পেয়েছেন।
TheMathNoob

উত্তর:


92

পসিক্স প্রেরণ / পুনর্নির্মাণকে পারমাণবিক ক্রিয়াকলাপ হিসাবে সংজ্ঞায়িত করে, তাই ধরে নিই যে আপনি পসিক্স প্রেরণ / পুনর্নির্মাণের কথা বলছেন তবে হ্যাঁ, আপনি একাধিক থ্রেড থেকে তাদের একসাথে কল করতে পারেন এবং জিনিসগুলি কাজ করবে।

এর অর্থ এই নয় যে এগুলি সমান্তরালে কার্যকর করা হবে - একাধিক প্রেরণের ক্ষেত্রে, দ্বিতীয়টি প্রথমটি সম্পূর্ণ না হওয়া অবধি ব্লক হয়ে যাবে। আপনি সম্ভবত এটি এতটা লক্ষ্য করতে পারবেন না, কারণ কোনও পাঠানো একবার তার ডেটা সকেটের বাফারে রাখলে এটি সম্পূর্ণ হয়।

আপনি যদি সোকপ্রেম সকেট ব্যবহার করছেন তবে পাঠান / রেকভ একটি বার্তা প্রেরণ বা গ্রহণ করতে পারে বলে সমান্তরাল কিছু করার চেষ্টা করা কার্যকর হওয়ার সম্ভাবনা কম, যার অর্থ জিনিসগুলি বিভক্ত হয়ে যেতে পারে।

কমপক্ষে 1 বাইট প্রেরণ বা পুনরুদ্ধার না করা অবধি কেবল SOCK_STREAM সকেটগুলিতে প্রেরণ / recv অবরুদ্ধ করা অবরুদ্ধ, সুতরাং ব্লকিং এবং অ-ব্লকিংয়ের মধ্যে পার্থক্যটি কার্যকর নয়।


1
@ জোয়াও: সোক_ডিজিআম সকেটটি "বার্তার সীমানা সংরক্ষণের" হিসাবে নথিভুক্ত করা হয়েছে, যা খুব পরিষ্কার নয়। লিনাক্স কার্নেল উত্সগুলি অনুসন্ধান করে আপনি কমপক্ষে দেখতে পাবেন যে প্রতিটি প্রেরণ এবং পুনঃনির্মাণ একক প্যাকেটের সাথে পরমাণুভাবে (কমপক্ষে udp এর জন্য) ডিল করে।
ক্রিস ডড

2
@ কেদার: আপনার অর্থ কী তা নিশ্চিত নয়। sendডেটা প্রেরণ বাফারের মধ্যে রাখার সাথে সাথে একটি রিটার্ন আসে এবং নেটওয়ার্ক স্ট্যাকের মাধ্যমে ডেটা নেটওয়ার্কের কাছে সংশ্লেষে প্রেরণ করা হয়। সুতরাং আপনার যদি একটি থ্রেড প্রেরণ এবং একটি থ্রেড গ্রহণ করা থাকে তবে প্রাপ্ত থ্রেডটি প্রথম প্যাকেট পাওয়ার আগে পাঠানোর থ্রেডের পক্ষে অনেকগুলি প্যাকেট প্রেরণ করা সম্ভব (এমনকি সম্ভবত)। এটি সম্পূর্ণ অ্যাসিনক্রোনাস এবং একইসাথে নয়।
ক্রিস ডড

6
@ ক্রিসডড, আপনি কি "পসিক্স প্রেরণ / পুনর্নির্মাণকে পারমাণবিক ক্রিয়াকলাপ হিসাবে সংজ্ঞায়িত করতে" একটি লিঙ্ক দিতে পারেন?
সুচিতিশি

2
@ সুটিয়ানশি: পসিক্স 1003.1c স্ট্যান্ডার্ড ডকুমেন্টটিতে 1003.1 এ সমস্ত ফাংশন তালিকাভুক্ত করা হয়েছে যা পুনরায় প্রবেশকারী (থ্রেড থেকে কল করা নিরাপদ) এবং যাগুলি নেই। দুর্ভাগ্যক্রমে, আমি কোথাও উপলব্ধ একটি বিনামূল্যে অনলাইন অনুলিপি সম্পর্কে অবগত নই।
ক্রিস ডড

2
@ ক্রিসডডড আমি অনুলিপি- সিস্টেমেস.আর.সি . / রূপান্তর ৪- তে অনুলিপিটি পেয়েছি এবং chapter.১ অধ্যায়ে সিস্টেম ইন্টারফেস টেবিলের তালিকা দেখতে পাচ্ছি তবে এটি কোথায় পারমাণবিক ক্রিয়াকলাপ হিসাবে কাজগুলি তালিকাভুক্ত করে তা দেখতে পাচ্ছি না। আপনাকে সন্দেহ করার মতো নয়, তবে আপনি কি দস্তাবেজটিতে আপনার বক্তব্যকে ন্যায়সঙ্গত করতে আপনার উত্তরটি ভাগ / সম্পাদনা করতে পারেন?
ব্যবহারকারী 153882

17

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

তবে, যদি পাঠানোর / গ্রহণের ক্রম শব্দার্থগতভাবে তাৎপর্যপূর্ণ হয় তবে আপনাকে নিজের (যথাক্রমে আপনার কোড) বিভিন্ন থ্রেডের ক্রিয়াকলাপের মধ্যে যথাযথ ক্রমগুলি নিশ্চিত করতে হবে - যেমন থ্রেডের ক্ষেত্রে সর্বদা হয়।


4

আমি দেখতে পাই না যে সমান্তরালভাবে প্রাপ্তি সম্ভবত কিছু অর্জন করতে পারে কি না। আপনার কাছে যদি 3 বাইট বার্তা থাকে তবে 1 থ্রেডটি প্রথম 2 বাইট এবং অন্যটি শেষ বাইট পেতে পারে তবে কোনটি ছিল তা বলার উপায় নেই। আপনার বার্তাগুলি কেবল বাইট দীর্ঘ না হলে একাধিক থ্রেড গ্রহণের মাধ্যমে আপনি নির্ভরযোগ্যভাবে কোনও কাজ করতে পারবেন না no

একাধিক প্রেরণ কাজ করতে পারে , আপনি যদি একটি বারে পুরো বার্তাটি প্রেরণ করেন তবে আমি নিশ্চিত নই। এটি সম্ভব যে একজন অন্যটিকে ওভাররাইট করতে পারে। অবশ্যই এটি করার কোনও কার্যকারিতা লাভ হবে না।

যদি একাধিক থ্রেড প্রেরণের দরকার হয় তবে আপনার একটি সিঙ্ক্রোনাইজ করা বার্তার সারিটি প্রয়োগ করতে হবে। একটি থ্রেড রয়েছে যা প্রকৃত প্রেরণ করে যা সারি থেকে বার্তাগুলি পড়ে এবং অন্য থ্রেডগুলিতে পুরো বার্তাগুলি সজ্জিত করে। একই জিনিসটি গ্রহণের জন্য কাজ করবে, তবে প্রাপ্ত থ্রেডটি বার্তাগুলির ফর্ম্যাটটি জানতে হবে যাতে এটি তাদের সঠিকভাবে ডিসরিয়ালাইজ করতে পারে।


9
আপনি যদি SOCK_DGRAM সকেট ব্যবহার করেন তবে প্রতিটি পুনর্বিবেচনাগুলি একটি একক ডেটাগ্রাম পাবে; এটি কখনই সংশোধনকারীদের মধ্যে বিভক্ত হবে না
ক্রিস ডড

2
@ নাহ, আমি সম্মত হই যে সমান্তরাল recvs কিছুই অর্জন করতে পারে না। সে কারণেই আমি এটি জিজ্ঞাসা করি না। আমার প্রশ্নটি সমান্তরালভাবে প্রেরণ / পুনর্নির্মাণ এবং তারপরে সমান্তরালভাবে একাধিক প্রেরণ। আপনার উত্তরটি সমান্তরাল প্রেরণের অন্তর্দৃষ্টি দেয়। একই জন্য ধন্যবাদ।
জয়

1
@ ক্রিস ভাল পয়েন্ট। আমি টিসিপি ধরে নিচ্ছিলাম। @ জায়ে আপনি এই প্রশ্নটি পরিষ্কার করতে পারেন যে "আমরা কী সমান্তরালে প্রেরণ / পুনর্নির্মাণ কল করতে পারি" শব্দগুলি আপনি সমান্তরালভাবে পেতে চান বলে মনে হচ্ছে।
নোয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.